[Python-checkins] GH-89519: Deprecate classmethod descriptor chaining (#92379)

rhettinger webhook-mailer at python.org
Fri May 6 03:58:01 EDT 2022


https://github.com/python/cpython/commit/ebaf0945f9f630f32755137a54abd0a49f068e9a
commit: ebaf0945f9f630f32755137a54abd0a49f068e9a
branch: main
author: Raymond Hettinger <rhettinger at users.noreply.github.com>
committer: rhettinger <rhettinger at users.noreply.github.com>
date: 2022-05-06T02:57:53-05:00
summary:

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

files:
A Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst
M Doc/howto/descriptor.rst
M Doc/library/functions.rst
M Doc/whatsnew/3.11.rst

diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst
index 825e9d0347f5d..5e9b110f0fe25 100644
--- a/Doc/howto/descriptor.rst
+++ b/Doc/howto/descriptor.rst
@@ -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::
 
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index cb86296897082..47b4b11cced85 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -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
diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst
index 822cb8b1f0f34..19ac8676ba638 100644
--- a/Doc/whatsnew/3.11.rst
+++ b/Doc/whatsnew/3.11.rst
@@ -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
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst
new file mode 100644
index 0000000000000..1460546d14886
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-06-02-29-53.gh-issue-89519.4OfkRE.rst	
@@ -0,0 +1,4 @@
+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.



More information about the Python-checkins mailing list