This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Wrapping a bound method with a @classmethod no longer works
Type: behavior Stage: patch review
Components: Interpreter Core Versions: Python 3.11, Python 3.10, Python 3.9
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: rhettinger Nosy List: msullivan, rhettinger
Priority: normal Keywords: patch

Created on 2022-02-16 01:56 by msullivan, last changed 2022-04-11 14:59 by admin.

Pull Requests
URL Status Linked Edit
PR 31367 open msullivan, 2022-02-16 03:22
Messages (2)
msg413310 - (view) Author: Michael J. Sullivan (msullivan) * Date: 2022-02-16 01:56
class A:
    def foo(self, cls): return 1

class B: pass

class B:
    bar = classmethod(A().foo)

B.bar()


In Python 3.8 and prior, this worked. Since Python 3.9, it produces "TypeError: A.foo() missing 1 required positional argument: 'cls'"

I tracked it down, and the issue was introduced by https://github.com/python/cpython/pull/8405/files, which makes classmethod's tp_descr_get invoke its argument tp_descr_get when present instead of calling PyMethod_New. That this was a semantics change that could break existing code may have been missed (though it is a fairly obscure such change).

The reason it breaks this case in particular of bound methods, though, is that bound methods have a tp_descr_get that does nothing (increfs the method and then returns it). Dropping that tp_descr_get fixes this issue and doesn't introduce any test failures. Not sure if there is some potential downstream breakage of that?

(This issue was originally reported to me by Jared Hance)
msg413450 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2022-02-17 20:02
This seems like a reasonable fix.  I'll wait a bit so that others can comment as well.

FWIW, we looking a potentially reverting the whole line of development starting with that commit.  It has caused a number of problems and no longer looks tenable.  See https://bugs.python.org/issue45356
History
Date User Action Args
2022-04-11 14:59:56adminsetgithub: 90920
2022-02-17 20:02:42rhettingersetassignee: rhettinger
messages: + msg413450
2022-02-16 03:22:23msullivansetkeywords: + patch
stage: patch review
pull_requests: + pull_request29517
2022-02-16 03:15:26AlexWaygoodsetnosy: + rhettinger
type: behavior
2022-02-16 01:56:29msullivancreate