GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — bpo-19072: Make @classmethod support chained decorators by berkerpeksag · Pull Request #8405 · python/cpython

Conversation

@berkerpeksag

@berkerpeksag berkerpeksag commented Jul 23, 2018 •
edited by bedevere-bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

https://bugs.python.org/issue19072

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

saulshanabrook reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
berkerpeksag added 2 commits July 23, 2018 13:28
@berkerpeksag
bpo-19072: Make @classmethod support chained decorators
1689459
@berkerpeksag
add newline back
8402e69
@berkerpeksag
berkerpeksag requested a review from serhiy-storchaka July 23, 2018 10:30
@the-knights-who-say-ni the-knights-who-say-ni added the CLA signed label Jul 23, 2018
@bedevere-bot bedevere-bot added the awaiting merge label Jul 23, 2018
berkerpeksag
berkerpeksag commented Jul 23, 2018
View reviewed changes
Comment thread Objects/funcobject.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Misc/NEWS.d/next/Core and Builtins/2018-07-23-13-09-54.bpo-19072.Gc59GS.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_property.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

serhiy-storchaka
serhiy-storchaka reviewed Jul 31, 2018
View reviewed changes

@serhiy-storchaka serhiy-storchaka left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide microbenchmark results.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_property.py
self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10)

@unittest.skipIf(sys.flags.optimize >= 2,
"Docstrings are omitted with -O2 and above")

@serhiy-storchaka serhiy-storchaka Jul 31, 2018

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does sys.flags.optimize really affects this test?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Misc/NEWS.d/next/Core and Builtins/2018-07-23-13-09-54.bpo-19072.Gc59GS.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

rhettinger and others added 4 commits August 24, 2019 12:49
@rhettinger
Fix wording in NEWS entry
92b6650
@rhettinger
Add documentation
a5ce586
@rhettinger
Merge branch 'master' into 19072-classmethod-descriptor
a013182
@rhettinger
Fix markup
4d3e413
@rhettinger
rhettinger merged commit 805f8f9 into python:master Aug 24, 2019
@bedevere-bot bedevere-bot removed the awaiting merge label Aug 24, 2019
@berkerpeksag
berkerpeksag deleted the 19072-classmethod-descriptor branch August 24, 2019 23:35
lisroach pushed a commit to lisroach/cpython that referenced this pull request Sep 10, 2019
@berkerpeksag @lisroach
bpo-19072: Make @classmethod support chained decorators (pythonGH-8405)
d3f2f91
DinoV pushed a commit to DinoV/cpython that referenced this pull request Jan 14, 2020
@berkerpeksag @DinoV
bpo-19072: Make @classmethod support chained decorators (pythonGH-8405)
85830e9
@WildCard65 WildCard65 mentioned this pull request Jun 25, 2020
Tests fail with Python 3.9 GrahamDumpleton/wrapt#160
Closed
websurfer5 pushed a commit to websurfer5/cpython that referenced this pull request Jul 20, 2020
@berkerpeksag @websurfer5
bpo-19072: Make @classmethod support chained decorators (pythonGH-8405)
d76531a
eriknw added a commit to eriknw/cpython that referenced this pull request Oct 18, 2020
@eriknw
bpo-42073: allow classmethod to wrap other classmethod-like descriptors.
f210e7f
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__`.
This was referenced Oct 18, 2020
[3.9] bpo-42073: allow classmethod to wrap other classmethod-like descriptors. #22757
Closed
Create a primer section for the descriptor howto guide #22906
Merged
@ambv ambv mentioned this pull request Jul 13, 2021
bpo-42073: allow classmethod to wrap other classmethod-like descriptors #27115
Merged
ambv added a commit to ambv/cpython that referenced this pull request Jul 15, 2021
@ambv @eriknw
bpo-42073: allow classmethod to wrap other classmethod-like descriptors.
1ab4920
Patch by Erik Welch.

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__`.

Co-authored-by: Erik Welch <[email protected]>
ambv added a commit that referenced this pull request Jul 15, 2021
@ambv @eriknw
bpo-42073: allow classmethod to wrap other classmethod-like descripto…
b83861f
…rs (#27115)

Patch by Erik Welch.

bpo-19072 (#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 #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__`.

Co-authored-by: Erik Welch <[email protected]>
@sthagen sthagen mentioned this pull request Jul 15, 2021
bpo-42073: allow classmethod to wrap other classmethod-like descripto… sthagen/python-cpython#524
Merged
@miss-islington miss-islington mentioned this pull request Jul 15, 2021
[3.10] bpo-42073: allow classmethod to wrap other classmethod-like descriptors (GH-27115) #27162
Merged
miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Jul 15, 2021
@ambv @miss-islington
bpo-42073: allow classmethod to wrap other classmethod-like descripto…
165e0d2
…rs (pythonGH-27115)

Patch by Erik Welch.

bpo-19072 (pythonGH-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 pythonGH-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__`.

Co-authored-by: Erik Welch <[email protected]>
(cherry picked from commit b83861f)

Co-authored-by: Łukasz Langa <[email protected]>
ambv pushed a commit that referenced this pull request Jul 15, 2021
@miss-islington @eriknw
bpo-42073: allow classmethod to wrap other classmethod-like descripto…
2ce8af3
…rs (GH-27115) (GH-27162)

Patch by Erik Welch.

bpo-19072 (GH-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 GH-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__`.

Co-authored-by: Erik Welch <[email protected]>
(cherry picked from commit b83861f)
@msullivan msullivan mentioned this pull request Feb 16, 2022
bpo-46764: Fix wrapping bound method with @classmethod #31367
Merged
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@serhiy-storchaka serhiy-storchaka serhiy-storchaka left review comments

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

5 participants

@berkerpeksag @serhiy-storchaka @rhettinger @the-knights-who-say-ni @bedevere-bot
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.