classification
Title: staticmethod and classmethod are ignored when disassemble class
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.6, Python 3.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: serhiy.storchaka Nosy List: ncoghlan, python-dev, serhiy.storchaka, xiang.zhang, yselivanov
Priority: normal Keywords: patch

Created on 2016-04-11 10:19 by xiang.zhang, last changed 2016-04-23 06:25 by serhiy.storchaka. This issue is now closed.

Files
File name Uploaded Description Edit
add_staticmethod_and_classmethod_when_dis.dis_a_class.patch xiang.zhang, 2016-04-11 10:19 review
add_staticmethod_and_classmethod_when_dis.dis_a_class_v2.patch xiang.zhang, 2016-04-11 10:39 review
add_staticmethod_and_classmethod_when_dis.dis_a_class_v3.patch xiang.zhang, 2016-04-11 15:29 review
add_staticmethod_and_classmethod_when_dis.dis_a_class_v4.patch xiang.zhang, 2016-04-12 02:54 review
add_staticmethod_and_classmethod_when_dis.dis_a_class_v5.patch xiang.zhang, 2016-04-12 06:52 review
Messages (12)
msg263176 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-04-11 10:19
Though the documentation tells when disassembling a class, it disassembles all methods for dis.dis, but staticmethod and classmethod are ignored. I don't know whether this is intended.

I write to patch to add staticmethod and classmethod. But unfortunately when I write tests, one unrelated test fails and I cannot figure out why.
msg263178 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-04-11 10:39
Though don't know why but simply replace %-4d with %3d in dis_bug708901 can fix the test. I updated the patch so all the tests pass and then I'll spend some time figuring out why.
msg263187 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-04-11 15:29
After researching the code, I think changing ' %-4d' to '%3d' in dis_bug708901 is right. Since I added some some lines and the lineno of test_bug708901 has arrived at 100+ and the leading space should not be there. According to the code of dis.dis, the right format string should be '%3d'. Not only test_bug708901, all the other ' %-4d' should be changed to '%3d'. If we add 1000+ lines at the head of the file, then all the ' %-4d' format string will lead to test failures.

I update my patch.
msg263220 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2016-04-12 02:20
The code and test changes in the latest patch look good to me. For documentation, I suggest updating https://docs.python.org/3/library/dis.html#dis.dis to:

- say "it disassembles all methods (including class and static methods)" when describing how classes are handled.

- add a version changed note for 3.6 to say that class and static methods are disassembled in addition to normal instance methods when disassembling a class
msg263221 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-04-12 02:54
I update the documentation. Learning from devguide, the change of whatsnew is the committer's work. ;)
msg263224 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2016-04-12 05:48
If this is new feature, perhaps the docs need the versionchanged directive. Otherwise the patch should be applied to all maintained branches.

Added other comments on Rietveld.
msg263226 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2016-04-12 05:48
New changeset b114a0650c44 by Serhiy Storchaka in branch '3.5':
Issue #26733: Fixed formatting line numbers in test_dis.
https://hg.python.org/cpython/rev/b114a0650c44

New changeset e0816ce68952 by Serhiy Storchaka in branch 'default':
Issue #26733: Fixed formatting line numbers in test_dis.
https://hg.python.org/cpython/rev/e0816ce68952

New changeset 16a27e38e9b5 by Serhiy Storchaka in branch '2.7':
Issue #26733: Fixed formatting line numbers in test_dis.
https://hg.python.org/cpython/rev/16a27e38e9b5
msg263233 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-04-12 06:52
Thanks for your comments Serhiy. I update the patch according to your comments.

Actually I don't think this is a new feature. Maybe staticmethod and classmethod are just forgotten.

As for separate tests for staticmethod and classmethod, I think they are not needed for this patch since right now we can use dis.dis to disassemble them explicitly. Only when dis.dis a class they are missing. But since there are no tests for them, adding tests for them is good.
msg263627 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2016-04-17 20:36
LGTM.

Nick, do you consider this as a new feature, or as a fix?
msg263643 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2016-04-18 05:29
Looking at the history of the dis module, I'd now class this as a bug fix for 3.5+ - it looks like dis.dis gained the ability to disassemble static and class methods as a side-effect of the removal of bound methods in Python 3 (see https://hg.python.org/cpython/rev/48af6375207e ) but because it was a side effect, the additional changes needed to also handle them when disassembling a class were missed.
msg264046 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2016-04-23 06:24
New changeset d14ea3964590 by Serhiy Storchaka in branch '3.5':
Issue #26733: Disassembling a class now disassembles class and static methods.
https://hg.python.org/cpython/rev/d14ea3964590

New changeset f96fec10cf25 by Serhiy Storchaka in branch 'default':
Issue #26733: Disassembling a class now disassembles class and static methods.
https://hg.python.org/cpython/rev/f96fec10cf25
msg264047 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2016-04-23 06:25
Thank you for your contribution Xiang Zhang.
History
Date User Action Args
2016-04-23 06:25:52serhiy.storchakasetstatus: open -> closed
resolution: fixed
messages: + msg264047

stage: commit review -> resolved
2016-04-23 06:24:55python-devsetmessages: + msg264046
2016-04-23 06:15:57serhiy.storchakasetassignee: serhiy.storchaka
stage: patch review -> commit review
versions: + Python 3.5
2016-04-18 05:29:28ncoghlansetmessages: + msg263643
2016-04-17 20:36:33serhiy.storchakasetmessages: + msg263627
2016-04-12 06:52:46xiang.zhangsetfiles: + add_staticmethod_and_classmethod_when_dis.dis_a_class_v5.patch

messages: + msg263233
2016-04-12 05:48:47python-devsetnosy: + python-dev
messages: + msg263226
2016-04-12 05:48:08serhiy.storchakasetnosy: + serhiy.storchaka
messages: + msg263224
2016-04-12 02:54:33xiang.zhangsetfiles: + add_staticmethod_and_classmethod_when_dis.dis_a_class_v4.patch

messages: + msg263221
2016-04-12 02:20:45ncoghlansetmessages: + msg263220
2016-04-11 15:29:39xiang.zhangsetfiles: + add_staticmethod_and_classmethod_when_dis.dis_a_class_v3.patch

messages: + msg263187
2016-04-11 10:58:15SilentGhostsetnosy: + ncoghlan, yselivanov

stage: patch review
2016-04-11 10:39:34xiang.zhangsetfiles: + add_staticmethod_and_classmethod_when_dis.dis_a_class_v2.patch

messages: + msg263178
2016-04-11 10:20:08xiang.zhangsettype: behavior
components: + Library (Lib)
versions: + Python 3.6
2016-04-11 10:19:34xiang.zhangcreate