Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[3.9] bpo-42073: allow classmethod to wrap other classmethod-like descriptors.#22757

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Closed
eriknw wants to merge1 commit intopython:3.9fromeriknw:bpo42073

Conversation

eriknw
Copy link
Contributor

@eriknweriknw commentedOct 18, 2020
edited by bedevere-bot
Loading

bpo-19072 (#8405) allowsclassmethod 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):

classA:@myclassmethoddeff1(cls):returncls@classmethod@myclassmethoddeff2(cls):returncls

In Python 3.8 and before,A.f2() returnA. Currently in Python 3.9, it returnstype(A). This PR makeA.f2() returnA again.

As of#8405, classmethod callsobj.__get__(type) ifobj 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 wantA, nottype(A)).

This PR updates classmethod to callobj.__get__(type, type) ifobj has__get__.

This PR is targeting Python 3.9 branch, because I think this is a bug fix. I can also target master (3.10).

I'm not really sure where to add a note of this change.

https://bugs.python.org/issue42073

bpo-19072 (python#8405) allows `classmethod` to wrap other descriptors, but this doesnot work when the wrapped descriptor mimics classmethod.  The current PR fixesthis.In Python 3.8 and before, one could create a callable descriptor such that thisworks as expected (see Lib/test/test_decorators.py for examples):```pythonclass 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, itreturns `type(A)`.  This PR make `A.f2()` return `A` again.As ofpython#8405, classmethod calls `obj.__get__(type)` if `obj` has `__get__`.This allows one to chain `@classmethod` and `@property` together.  Whenusing classmethod-like descriptors, it's the second argument to `__get__`--theowner 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 firstargument, 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__`.
@eriknweriknw changed the titlebpo-42073: allow classmethod to wrap other classmethod-like descriptors.[3.9] bpo-42073: allow classmethod to wrap other classmethod-like descriptors.Oct 18, 2020
@github-actions
Copy link

This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 5 days

@ambvambv requested review fromvsajip,warsaw anda team ascode ownersJuly 13, 2021 14:52
@ambvambv changed the base branch frommain to3.9July 13, 2021 14:53
@ambv
Copy link
Contributor

Oops, changing the base of the pull request didn't do what I thought it would and reverting back to 3.9 leaves the mess as is. I'll recreate this pull request onmain from scratch.

encukou reacted with thumbs up emoji

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@1st11st1Awaiting requested review from 1st1

@abalkinabalkinAwaiting requested review from abalkin

@asvetlovasvetlovAwaiting requested review from asvetlov

@berkerpeksagberkerpeksagAwaiting requested review from berkerpeksag

@brettcannonbrettcannonAwaiting requested review from brettcannon

@encukouencukouAwaiting requested review from encukou

@ericsnowcurrentlyericsnowcurrentlyAwaiting requested review from ericsnowcurrently

@ericvsmithericvsmithAwaiting requested review from ericvsmith

@ethanfurmanethanfurmanAwaiting requested review from ethanfurman

@gpsheadgpsheadAwaiting requested review from gpshead

@gvanrossumgvanrossumAwaiting requested review from gvanrossum

@ilevkivskyiilevkivskyiAwaiting requested review from ilevkivskyi

@isidenticalisidenticalAwaiting requested review from isidentical

@lysnikolaoulysnikolaouAwaiting requested review from lysnikolaou

@markshannonmarkshannonAwaiting requested review from markshannon

@methanemethaneAwaiting requested review from methane

@ncoghlanncoghlanAwaiting requested review from ncoghlan

@pablogsalpablogsalAwaiting requested review from pablogsal

@pgansslepganssleAwaiting requested review from pganssle

@rhettingerrhettingerAwaiting requested review from rhettinger

@terryjreedyterryjreedyAwaiting requested review from terryjreedy

@tirantiranAwaiting requested review from tiran

@vsajipvsajipAwaiting requested review from vsajip

@warsawwarsawAwaiting requested review from warsaw

Assignees
No one assigned
Labels
awaiting reviewstaleStale PR or inactive for long period of time.
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

4 participants
@eriknw@ambv@the-knights-who-say-ni@bedevere-bot

[8]ページ先頭

©2009-2025 Movatter.jp