mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	GH-89519: Deprecate classmethod descriptor chaining (#92379)
This commit is contained in:
		
							parent
							
								
									bebb944de5
								
							
						
					
					
						commit
						ebaf0945f9
					
				
					 4 changed files with 20 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue