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

AlexWaygood webhook-mailer at python.org
Fri Aug 18 11:44:42 EDT 2023


https://github.com/python/cpython/commit/9bb576cb07b42f34fd882b8502642b024f771c62
commit: 9bb576cb07b42f34fd882b8502642b024f771c62
branch: main
author: Tyler Smart <40041862+tjsmart at users.noreply.github.com>
committer: AlexWaygood <Alex.Waygood at Gmail.com>
date: 2023-08-18T15:44:38Z
summary:

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

Co-authored-by: Alex Waygood <Alex.Waygood at Gmail.com>

files:
A Misc/NEWS.d/next/Library/2023-08-16-00-24-07.gh-issue-107995.TlTp5t.rst
M Lib/functools.py
M Lib/test/test_doctest.py
M Lib/test/test_functools.py
M Misc/ACKS

diff --git a/Lib/functools.py b/Lib/functools.py
index be44ccdae6b69..a2fc28779dbdd 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -984,6 +984,7 @@ def __init__(self, func):
         self.func = func
         self.attrname = None
         self.__doc__ = func.__doc__
+        self.__module__ = func.__module__
 
     def __set_name__(self, owner, name):
         if self.attrname is None:
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index bea52c6de7ec6..c364e81a6b149 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -111,6 +111,14 @@ def a_classmethod_property(cls):
         """
         return cls.a_class_attribute
 
+    @functools.cached_property
+    def a_cached_property(self):
+        """
+        >>> print(SampleClass(29).get())
+        29
+        """
+        return "hello"
+
     class NestedClass:
         """
         >>> x = SampleClass.NestedClass(5)
@@ -515,6 +523,7 @@ def basics(): r"""
      3  SampleClass.NestedClass
      1  SampleClass.NestedClass.__init__
      1  SampleClass.__init__
+     1  SampleClass.a_cached_property
      2  SampleClass.a_classmethod
      1  SampleClass.a_classmethod_property
      1  SampleClass.a_property
@@ -571,6 +580,7 @@ def basics(): r"""
      3  some_module.SampleClass.NestedClass
      1  some_module.SampleClass.NestedClass.__init__
      1  some_module.SampleClass.__init__
+     1  some_module.SampleClass.a_cached_property
      2  some_module.SampleClass.a_classmethod
      1  some_module.SampleClass.a_classmethod_property
      1  some_module.SampleClass.a_property
@@ -613,6 +623,7 @@ def basics(): r"""
      3  SampleClass.NestedClass
      1  SampleClass.NestedClass.__init__
      1  SampleClass.__init__
+     1  SampleClass.a_cached_property
      2  SampleClass.a_classmethod
      1  SampleClass.a_classmethod_property
      1  SampleClass.a_property
@@ -634,6 +645,7 @@ def basics(): r"""
      0  SampleClass.NestedClass.get
      0  SampleClass.NestedClass.square
      1  SampleClass.__init__
+     1  SampleClass.a_cached_property
      2  SampleClass.a_classmethod
      1  SampleClass.a_classmethod_property
      1  SampleClass.a_property
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 50770f066a5e1..5ba7f51c91f3b 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -3105,6 +3105,9 @@ def test_access_from_class(self):
     def test_doc(self):
         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):
         """Caching still works for a subclass defining __set__."""
         class readonly_cached_property(py_functools.cached_property):
diff --git a/Misc/ACKS b/Misc/ACKS
index 8b8c5ad8434bd..475c6ec3dab73 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1706,6 +1706,7 @@ Roman Skurikhin
 Ville Skyttä
 Michael Sloan
 Nick Sloan
+Tyler Smart
 Radek Smejkal
 Václav Šmilauer
 Casper W. Smet
diff --git a/Misc/NEWS.d/next/Library/2023-08-16-00-24-07.gh-issue-107995.TlTp5t.rst b/Misc/NEWS.d/next/Library/2023-08-16-00-24-07.gh-issue-107995.TlTp5t.rst
new file mode 100644
index 0000000000000..7247f6b3abc9b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-16-00-24-07.gh-issue-107995.TlTp5t.rst
@@ -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.



More information about the Python-checkins mailing list