[3.9] bpo-42073: allow classmethod to wrap other classmethod-like descriptors. by eriknw · Pull Request #22757 · python/cpython
bpo-19072 (python#8405) allows `classmethod` to wrap other descriptors, but this does not work when the wrapped descriptor mimics classmethod. The current PR fixes this. In Python 3.8 and before, one could create a callable descriptor such that this works as expected (see Lib/test/test_decorators.py for examples): ```python class A: @myclassmethod def f1(cls): return cls @classmethod @myclassmethod def f2(cls): return cls ``` In Python 3.8 and before, `A.f2()` return `A`. Currently in Python 3.9, it returns `type(A)`. This PR make `A.f2()` return `A` again. As of python#8405, classmethod calls `obj.__get__(type)` if `obj` has `__get__`. This allows one to chain `@classmethod` and `@property` together. When using classmethod-like descriptors, it's the second argument to `__get__`--the owner or the type--that is important, but this argument is currently missing. Since it is None, the "owner" argument is assumed to be the type of the first argument, which, in this case, is wrong (we want `A`, not `type(A)`). This PR updates classmethod to call `obj.__get__(type, type)` if `obj` has `__get__`.
eriknw
changed the title
bpo-42073: allow classmethod to wrap other classmethod-like descriptors.
[3.9] bpo-42073: allow classmethod to wrap other classmethod-like descriptors.
ambv
changed the base branch from
3.9
to
main
ambv
requested review from
1st1,
abalkin,
asvetlov,
berkerpeksag,
brettcannon,
encukou,
ericsnowcurrently,
ericvsmith,
ethanfurman,
gpshead,
gvanrossum,
ilevkivskyi,
isidentical,
lysnikolaou,
markshannon,
methane,
ncoghlan,
pablogsal,
pganssle,
rhettinger,
terryjreedy and
tiran
as code owners
ambv
changed the base branch from
main
to
3.9
ambv
mentioned this pull request
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters