https://github.com/python/cpython/commit/13af281a53bcf522f933afbbe6af4ed2da823943
commit: 13af281a53bcf522f933afbbe6af4ed2da823943
branch: 3.12
author: Miss Islington (bot) <[email protected]>
committer: AlexWaygood <[email protected]>
date: 2024-02-14T15:58:14Z
summary:

[3.12] gh-115392: Fix doctest reporting incorrect line numbers for decorated 
functions (GH-115440) (#115459)

gh-115392: Fix doctest reporting incorrect line numbers for decorated functions 
(GH-115440)
(cherry picked from commit bb791c7728e0508ad5df28a90b27e202d66a9cfa)

Co-authored-by: Brian Schubert <[email protected]>

files:
A Lib/test/test_doctest/decorator_mod.py
A Misc/NEWS.d/next/Library/2024-02-13-18-27-03.gh-issue-115392.gle5tp.rst
M Lib/doctest.py
M Lib/test/test_doctest/doctest_lineno.py
M Lib/test/test_doctest/test_doctest.py

diff --git a/Lib/doctest.py b/Lib/doctest.py
index 4630e4007e78a6..cda2f5a06b270e 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -1124,7 +1124,7 @@ def _find_lineno(self, obj, source_lines):
             obj = obj.fget
         if inspect.isfunction(obj) and getattr(obj, '__doc__', None):
             # We don't use `docstring` var here, because `obj` can be changed.
-            obj = obj.__code__
+            obj = inspect.unwrap(obj).__code__
         if inspect.istraceback(obj): obj = obj.tb_frame
         if inspect.isframe(obj): obj = obj.f_code
         if inspect.iscode(obj):
diff --git a/Lib/test/test_doctest/decorator_mod.py 
b/Lib/test/test_doctest/decorator_mod.py
new file mode 100644
index 00000000000000..9f106888411202
--- /dev/null
+++ b/Lib/test/test_doctest/decorator_mod.py
@@ -0,0 +1,10 @@
+# This module is used in `doctest_lineno.py`.
+import functools
+
+
+def decorator(f):
+    @functools.wraps(f)
+    def inner():
+        return f()
+
+    return inner
diff --git a/Lib/test/test_doctest/doctest_lineno.py 
b/Lib/test/test_doctest/doctest_lineno.py
index 677c569cf710eb..0dbcd9a11eaba2 100644
--- a/Lib/test/test_doctest/doctest_lineno.py
+++ b/Lib/test/test_doctest/doctest_lineno.py
@@ -67,3 +67,12 @@ def property_with_doctest(self):
 
 # https://github.com/python/cpython/issues/99433
 str_wrapper = object().__str__
+
+
+# https://github.com/python/cpython/issues/115392
+from test.test_doctest.decorator_mod import decorator
+
+@decorator
+@decorator
+def func_with_docstring_wrapped():
+    """Some unrelated info."""
diff --git a/Lib/test/test_doctest/test_doctest.py 
b/Lib/test/test_doctest/test_doctest.py
index 21f27edc06858b..9c8a8ba690d557 100644
--- a/Lib/test/test_doctest/test_doctest.py
+++ b/Lib/test/test_doctest/test_doctest.py
@@ -686,6 +686,7 @@ def basics(): r"""
      None  
test.test_doctest.doctest_lineno.MethodWrapper.method_without_docstring
        61  test.test_doctest.doctest_lineno.MethodWrapper.property_with_doctest
         4  test.test_doctest.doctest_lineno.func_with_docstring
+       77  test.test_doctest.doctest_lineno.func_with_docstring_wrapped
        12  test.test_doctest.doctest_lineno.func_with_doctest
      None  test.test_doctest.doctest_lineno.func_without_docstring
 
diff --git 
a/Misc/NEWS.d/next/Library/2024-02-13-18-27-03.gh-issue-115392.gle5tp.rst 
b/Misc/NEWS.d/next/Library/2024-02-13-18-27-03.gh-issue-115392.gle5tp.rst
new file mode 100644
index 00000000000000..1c3368968e4cf0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-02-13-18-27-03.gh-issue-115392.gle5tp.rst
@@ -0,0 +1,2 @@
+Fix a bug in :mod:`doctest` where incorrect line numbers would be
+reported for decorated functions.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to