From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Apr 2021 01:16:16 +0000 (-0700) Subject: bpo-43917: Fix pure python equivalent for classmethod (GH-25544) (GH-25546) X-Git-Tag: v3.9.5~61 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=34be48450f03b121be10a9f8e8989603478f0469;p=thirdparty%2FPython%2Fcpython.git bpo-43917: Fix pure python equivalent for classmethod (GH-25544) (GH-25546) Reported by Yahor Harunovich. (cherry picked from commit 14092b5a4ae4caf1c77f685450016a0d1ad0bd6c) --- diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 93dd35441f41..eef6b2dfa00c 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1319,7 +1319,7 @@ Using the non-data descriptor protocol, a pure Python version of def __get__(self, obj, cls=None): if cls is None: cls = type(obj) - if hasattr(obj, '__get__'): + if hasattr(type(self.f), '__get__'): return self.f.__get__(cls) return MethodType(self.f, cls) @@ -1332,6 +1332,12 @@ Using the non-data descriptor protocol, a pure Python version of def cm(cls, x, y): return (cls, x, y) + @ClassMethod + @property + def __doc__(cls): + return f'A doc for {cls.__name__!r}' + + .. doctest:: :hide: @@ -1343,6 +1349,11 @@ Using the non-data descriptor protocol, a pure Python version of >>> t.cm(11, 22) (, 11, 22) + # Check the alternate path for chained descriptors + >>> T.__doc__ + "A doc for 'T'" + + The code path for ``hasattr(obj, '__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: diff --git a/Misc/ACKS b/Misc/ACKS index 4f7c92c9dc0f..ee2f3fa2e3aa 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -380,7 +380,7 @@ Brian Curtin Jason Curtis Hakan Celik Paul Dagnelie -Florian Dahlitz +Florian Dahlitz Lisandro Dalcin Darren Dale Andrew Dalke @@ -684,6 +684,7 @@ Michael Haubenwallner Janko Hauser Flavian Hautbois Rycharde Hawkes +Yahor Harunovich Ben Hayden Jochen Hayek Tim Heaney