Skip to content
Snippets Groups Projects
Unverified Commit ebaf0945 authored by Raymond Hettinger's avatar Raymond Hettinger Committed by GitHub
Browse files

GH-89519: Deprecate classmethod descriptor chaining (#92379)

parent bebb944d
Branches
Tags
No related merge requests found
......@@ -1349,6 +1349,8 @@ Using the non-data descriptor protocol, a pure Python version of
if cls is None:
cls = type(obj)
if hasattr(type(self.f), '__get__'):
# This code path was added in Python 3.9
# and was deprecated in Python 3.11.
return self.f.__get__(cls, cls)
return MethodType(self.f, cls)
......@@ -1386,7 +1388,7 @@ Using the non-data descriptor protocol, a pure Python version of
The code path for ``hasattr(type(self.f), '__get__')`` was added in
Python 3.9 and makes it possible for :func:`classmethod` to support
chained decorators. For example, a classmethod and property could be
chained together:
chained together. In Python 3.11, this functionality was deprecated.
.. testcode::
......
......@@ -271,6 +271,11 @@ are always available. They are listed here in alphabetical order.
``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and
have a new ``__wrapped__`` attribute.
.. versionchanged:: 3.11
Class methods can no longer wrap other :term:`descriptors <descriptor>` such as
:func:`property`.
.. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
Compile the *source* into a code or AST object. Code objects can be executed
......
......@@ -1084,6 +1084,14 @@ CPython bytecode changes
Deprecated
==========
* Chaining :class:`classmethod` descriptors (introduced in :issue:`19072`)
is now deprecated. It can no longer be used to wrap other descriptors
such as :class:`property`. The core design of this feature was flawed
and caused a number of downstream problems. To "pass-through" a
:class:`classmethod`, consider using the ``__wrapped__`` attribute
that was added in Python 3.10.
(Contributed by Raymond Hettinger in :gh:`89519`.)
* Octal escapes with value larger than ``0o377`` now produce
a :exc:`DeprecationWarning`.
In a future Python version they will be a :exc:`SyntaxWarning` and
......
Chaining classmethod descriptors (introduced in bpo-19072) is deprecated. It
can no longer be used to wrap other descriptors such as property(). The
core design of this feature was flawed, and it caused a number of downstream
problems.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment