cpython/Objects
Łukasz Langa b83861f026
bpo-42073: allow classmethod to wrap other classmethod-like descriptors (#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 <erik.n.welch@gmail.com>
2021-07-15 15:16:19 +02:00
..
clinic bpo-43950: Add option to opt-out of PEP-657 (GH-27023) 2021-07-07 20:07:12 +01:00
stringlib Remove effbot urls (GH-26308) 2021-05-22 14:09:54 +02:00
abstract.c bpo-31861: Add aiter and anext to builtins (#23847) 2021-03-23 15:47:21 -07:00
accu.c bpo-35081: Move accu.h to Include/internal/pycore_accu.h (GH-10271) 2018-11-01 02:30:36 +01:00
boolobject.c bpo-41870: Avoid the test when nargs=0 (GH-22462) 2020-10-01 13:50:40 +09:00
bytearrayobject.c bpo-42128: Structural Pattern Matching (PEP 634) (GH-22917) 2021-02-26 14:51:55 -08:00
bytes_methods.c bpo-43179: Generalise alignment for optimised string routines (GH-24624) 2021-03-31 12:12:39 +02:00
bytesobject.c bpo-42128: Structural Pattern Matching (PEP 634) (GH-22917) 2021-02-26 14:51:55 -08:00
call.c bpo-42990: Further refactoring of PyEval_ functions. (GH-24368) 2021-02-01 10:42:03 +00:00
capsule.c bpo-42519: Replace PyObject_MALLOC() with PyObject_Malloc() (GH-23587) 2020-12-01 10:37:39 +01:00
cellobject.c bpo-40268: Remove unused pycore_pymem.h includes (GH-19531) 2020-04-15 02:57:50 +02:00
classobject.c bpo-40268: Remove unused pycore_pymem.h includes (GH-19531) 2020-04-15 02:57:50 +02:00
codeobject.c bpo-43950: Add option to opt-out of PEP-657 (GH-27023) 2021-07-07 20:07:12 +01:00
complexobject.c bpo-43475: Fix worst case collision behavior for NaN instances (GH-25493) 2021-04-22 08:34:57 -07:00
descrobject.c bpo-43977: Use tp_flags for collection matching (GH-25723) 2021-04-30 09:50:28 +01:00
dictnotes.txt
dictobject.c bpo-44531: Add _PyType_AllocNoTrack() function (GH-26947) 2021-07-01 02:30:46 +02:00
enumobject.c bpo-42536: GC track recycled tuples (GH-23623) 2020-12-04 19:45:57 -08:00
exception_handling_notes.txt bpo-40222: "Zero cost" exception handling (GH-25729) 2021-05-07 15:19:19 +01:00
exceptions.c bpo-44029: Remove Py_UNICODE APIs (GH-25881) 2021-05-07 15:58:29 +09:00
fileobject.c bpo-43916: PyStdPrinter_Type uses Py_TPFLAGS_DISALLOW_INSTANTIATION (GH-25749) 2021-04-30 14:56:27 +02:00
floatobject.c bpo-43475: Fix worst case collision behavior for NaN instances (GH-25493) 2021-04-22 08:34:57 -07:00
frameobject.c bpo-43693: Turn localspluskinds into an object (GH-26749) 2021-06-21 13:53:04 -07:00
funcobject.c bpo-42073: allow classmethod to wrap other classmethod-like descriptors (#27115) 2021-07-15 15:16:19 +02:00
genericaliasobject.c bpo-44490: Add __parameters__ and __getitem__ to types.Union (GH-26980) 2021-07-06 11:04:33 -07:00
genobject.c bpo-44530: Add co_qualname field to PyCodeObject (GH-26941) 2021-07-07 12:21:51 +01:00
interpreteridobject.c bpo-43962: Fix _PyInterpreterState_IDIncref() (GH-25683) 2021-04-28 13:40:44 +02:00
iterobject.c bpo-43751: Fix anext() bug where it erroneously returned None (GH-25238) 2021-04-11 05:51:35 +01:00
listobject.c bpo-43977: Use tp_flags for collection matching (GH-25723) 2021-04-30 09:50:28 +01:00
listsort.txt Fixes in sorting descriptions (GH-18317) 2020-02-03 08:47:20 -08:00
lnotab_notes.txt Fix typo in lnotab_notes.txt (GH-26711) 2021-06-14 11:49:05 -03:00
longobject.c Fix a potential reference-counting bug in long_pow (GH-26690) 2021-06-13 08:19:29 +01:00
memoryobject.c bpo-43977: Use tp_flags for collection matching (GH-25723) 2021-04-30 09:50:28 +01:00
methodobject.c bpo-42015: Reorder dereferencing calls in meth_dealloc, to make sure m_self is kept alive long enough (GH-22670) 2020-10-13 00:06:19 +03:00
moduleobject.c bpo-43770: Cleanup PyModuleDef_Init() (GH-26879) 2021-06-23 15:40:27 +02:00
namespaceobject.c bpo-39075: types.SimpleNamespace no longer sorts attributes in its repr (GH-19430) 2020-05-15 18:27:54 -07:00
object.c bpo-43770: Cleanup _PyObject_GetMethod() (GH-26946) 2021-07-01 03:11:59 +02:00
obmalloc.c bpo-44032: Move data stack to thread from FrameObject. (GH-26076) 2021-05-21 10:57:35 +01:00
odictobject.c bpo-44337: Port LOAD_ATTR to PEP 659 adaptive interpreter (GH-26595) 2021-06-10 08:46:01 +01:00
picklebufobject.c bpo-36785: PEP 574 implementation (GH-7076) 2019-05-26 17:10:09 +02:00
rangeobject.c bpo-43977: Use tp_flags for collection matching (GH-25723) 2021-04-30 09:50:28 +01:00
README Issue #18093: Factor out the programs that embed the runtime 2014-07-25 21:52:14 +10:00
setobject.c bpo-43198: Revert 3dd2157 that removed freeslot tracking. (#25010) 2021-03-24 15:33:27 -07:00
sliceobject.c bpo-43268: Pass interp rather than tstate to internal functions (GH-24580) 2021-02-19 15:10:45 +01:00
structseq.c bpo-43916: Move the _PyStructSequence_InitType function to the internal API (GH-25854) 2021-05-03 15:50:24 +01:00
tupleobject.c bpo-44531: Add _PyType_AllocNoTrack() function (GH-26947) 2021-07-01 02:30:46 +02:00
typeobject.c bpo-43908: Immutable types inherit vectorcall (GH-27001) 2021-07-08 12:48:01 +02:00
typeslots.inc bpo-41073: PyType_GetSlot() can now accept static types. (GH-21931) 2020-11-10 12:53:46 -08:00
typeslots.py bpo-41073: PyType_GetSlot() can now accept static types. (GH-21931) 2020-11-10 12:53:46 -08:00
unicodectype.c Removed unintentional trailing spaces in non-external and non-generated C files. 2015-03-18 21:53:15 +02:00
unicodeobject.c bpo-44110: Improve string's __getitem__ error message (GH-26042) 2021-06-27 15:04:57 +03:00
unicodetype_db.h closes bpo-39926: Update Unicode to 13.0.0. (GH-18910) 2020-03-10 20:41:34 -07:00
unionobject.c bpo-44632: Fix support of TypeVar in the union type (GH-27139) 2021-07-14 20:09:15 +03:00
weakrefobject.c bpo-44523: Remove the pass-through for hash() in weakref proxy objects (GH-26950) 2021-06-29 23:58:45 +01:00

Source files for various builtin objects