◐ Shell
clean mode source ↗

gh-89519: Remove classmethod descriptor chaining, deprecated since 3.11 by rhettinger · Pull Request #110163 · python/cpython

Expand Up @@ -291,44 +291,6 @@ def bar(): return 42 self.assertEqual(bar(), 42) self.assertEqual(actions, expected_actions)
def test_wrapped_descriptor_inside_classmethod(self): class BoundWrapper: def __init__(self, wrapped): self.__wrapped__ = wrapped
def __call__(self, *args, **kwargs): return self.__wrapped__(*args, **kwargs)
class Wrapper: def __init__(self, wrapped): self.__wrapped__ = wrapped
def __get__(self, instance, owner): bound_function = self.__wrapped__.__get__(instance, owner) return BoundWrapper(bound_function)
def decorator(wrapped): return Wrapper(wrapped)
class Class: @decorator @classmethod def inner(cls): # This should already work. return 'spam'
@classmethod @decorator def outer(cls): # Raised TypeError with a message saying that the 'Wrapper' # object is not callable. return 'eggs'
self.assertEqual(Class.inner(), 'spam') self.assertEqual(Class.outer(), 'eggs') self.assertEqual(Class().inner(), 'spam') self.assertEqual(Class().outer(), 'eggs')
def test_bound_function_inside_classmethod(self): class A: def foo(self, cls): Expand All @@ -339,91 +301,6 @@ class B:
self.assertEqual(B.bar(), 'spam')
def test_wrapped_classmethod_inside_classmethod(self): class MyClassMethod1: def __init__(self, func): self.func = func
def __call__(self, cls): if hasattr(self.func, '__get__'): return self.func.__get__(cls, cls)() return self.func(cls)
def __get__(self, instance, owner=None): if owner is None: owner = type(instance) return MethodType(self, owner)
class MyClassMethod2: def __init__(self, func): if isinstance(func, classmethod): func = func.__func__ self.func = func
def __call__(self, cls): return self.func(cls)
def __get__(self, instance, owner=None): if owner is None: owner = type(instance) return MethodType(self, owner)
for myclassmethod in [MyClassMethod1, MyClassMethod2]: class A: @myclassmethod def f1(cls): return cls
@classmethod @myclassmethod def f2(cls): return cls
@myclassmethod @classmethod def f3(cls): return cls
@classmethod @classmethod def f4(cls): return cls
@myclassmethod @MyClassMethod1 def f5(cls): return cls
@myclassmethod @MyClassMethod2 def f6(cls): return cls
self.assertIs(A.f1(), A) self.assertIs(A.f2(), A) self.assertIs(A.f3(), A) self.assertIs(A.f4(), A) self.assertIs(A.f5(), A) self.assertIs(A.f6(), A) a = A() self.assertIs(a.f1(), A) self.assertIs(a.f2(), A) self.assertIs(a.f3(), A) self.assertIs(a.f4(), A) self.assertIs(a.f5(), A) self.assertIs(a.f6(), A)
def f(cls): return cls
self.assertIs(myclassmethod(f).__get__(a)(), A) self.assertIs(myclassmethod(f).__get__(a, A)(), A) self.assertIs(myclassmethod(f).__get__(A, A)(), A) self.assertIs(myclassmethod(f).__get__(A)(), type(A)) self.assertIs(classmethod(f).__get__(a)(), A) self.assertIs(classmethod(f).__get__(a, A)(), A) self.assertIs(classmethod(f).__get__(A, A)(), A) self.assertIs(classmethod(f).__get__(A)(), type(A))
class TestClassDecorators(unittest.TestCase):
Expand Down