gh-107995: Fix doctest collection of functools.cached_property objects (#107996)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Tyler Smart 2023-08-18 08:44:38 -07:00 committed by GitHub
parent 28cab71f95
commit 9bb576cb07
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 0 deletions

View file

@ -984,6 +984,7 @@ class cached_property:
self.func = func self.func = func
self.attrname = None self.attrname = None
self.__doc__ = func.__doc__ self.__doc__ = func.__doc__
self.__module__ = func.__module__
def __set_name__(self, owner, name): def __set_name__(self, owner, name):
if self.attrname is None: if self.attrname is None:

View file

@ -111,6 +111,14 @@ class SampleClass:
""" """
return cls.a_class_attribute return cls.a_class_attribute
@functools.cached_property
def a_cached_property(self):
"""
>>> print(SampleClass(29).get())
29
"""
return "hello"
class NestedClass: class NestedClass:
""" """
>>> x = SampleClass.NestedClass(5) >>> x = SampleClass.NestedClass(5)
@ -515,6 +523,7 @@ methods, classmethods, staticmethods, properties, and nested classes.
3 SampleClass.NestedClass 3 SampleClass.NestedClass
1 SampleClass.NestedClass.__init__ 1 SampleClass.NestedClass.__init__
1 SampleClass.__init__ 1 SampleClass.__init__
1 SampleClass.a_cached_property
2 SampleClass.a_classmethod 2 SampleClass.a_classmethod
1 SampleClass.a_classmethod_property 1 SampleClass.a_classmethod_property
1 SampleClass.a_property 1 SampleClass.a_property
@ -571,6 +580,7 @@ functions, classes, and the `__test__` dictionary, if it exists:
3 some_module.SampleClass.NestedClass 3 some_module.SampleClass.NestedClass
1 some_module.SampleClass.NestedClass.__init__ 1 some_module.SampleClass.NestedClass.__init__
1 some_module.SampleClass.__init__ 1 some_module.SampleClass.__init__
1 some_module.SampleClass.a_cached_property
2 some_module.SampleClass.a_classmethod 2 some_module.SampleClass.a_classmethod
1 some_module.SampleClass.a_classmethod_property 1 some_module.SampleClass.a_classmethod_property
1 some_module.SampleClass.a_property 1 some_module.SampleClass.a_property
@ -613,6 +623,7 @@ By default, an object with no doctests doesn't create any tests:
3 SampleClass.NestedClass 3 SampleClass.NestedClass
1 SampleClass.NestedClass.__init__ 1 SampleClass.NestedClass.__init__
1 SampleClass.__init__ 1 SampleClass.__init__
1 SampleClass.a_cached_property
2 SampleClass.a_classmethod 2 SampleClass.a_classmethod
1 SampleClass.a_classmethod_property 1 SampleClass.a_classmethod_property
1 SampleClass.a_property 1 SampleClass.a_property
@ -634,6 +645,7 @@ displays.
0 SampleClass.NestedClass.get 0 SampleClass.NestedClass.get
0 SampleClass.NestedClass.square 0 SampleClass.NestedClass.square
1 SampleClass.__init__ 1 SampleClass.__init__
1 SampleClass.a_cached_property
2 SampleClass.a_classmethod 2 SampleClass.a_classmethod
1 SampleClass.a_classmethod_property 1 SampleClass.a_classmethod_property
1 SampleClass.a_property 1 SampleClass.a_property

View file

@ -3105,6 +3105,9 @@ class TestCachedProperty(unittest.TestCase):
def test_doc(self): def test_doc(self):
self.assertEqual(CachedCostItem.cost.__doc__, "The cost of the item.") self.assertEqual(CachedCostItem.cost.__doc__, "The cost of the item.")
def test_module(self):
self.assertEqual(CachedCostItem.cost.__module__, CachedCostItem.__module__)
def test_subclass_with___set__(self): def test_subclass_with___set__(self):
"""Caching still works for a subclass defining __set__.""" """Caching still works for a subclass defining __set__."""
class readonly_cached_property(py_functools.cached_property): class readonly_cached_property(py_functools.cached_property):

View file

@ -1706,6 +1706,7 @@ Roman Skurikhin
Ville Skyttä Ville Skyttä
Michael Sloan Michael Sloan
Nick Sloan Nick Sloan
Tyler Smart
Radek Smejkal Radek Smejkal
Václav Šmilauer Václav Šmilauer
Casper W. Smet Casper W. Smet

View file

@ -0,0 +1,5 @@
The ``__module__`` attribute on instances of :class:`functools.cached_property`
is now set to the name of the module in which the cached_property is defined,
rather than "functools". This means that doctests in ``cached_property``
docstrings are now properly collected by the :mod:`doctest` module. Patch by
Tyler Smart.