]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117692: Fix `AttributeError` in `DocTestFinder` on wrapped `builtin_or_method...
authorNikita Sobolev <mail@sobolevn.me>
Wed, 10 Apr 2024 09:52:47 +0000 (12:52 +0300)
committerGitHub <noreply@github.com>
Wed, 10 Apr 2024 09:52:47 +0000 (10:52 +0100)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Lib/doctest.py
Lib/test/test_doctest/test_doctest.py
Misc/NEWS.d/next/Library/2024-04-09-23-22-21.gh-issue-117692.EciInD.rst [new file with mode: 0644]

index fc0da590018b4087459c2f2c497938e362168024..4e362cbb9c9d6b4adf526f87abcf44afb41ff46e 100644 (file)
@@ -1140,7 +1140,14 @@ class DocTestFinder:
             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 = inspect.unwrap(obj).__code__
+            obj = inspect.unwrap(obj)
+            try:
+                obj = obj.__code__
+            except AttributeError:
+                # Functions implemented in C don't necessarily
+                # have a __code__ attribute.
+                # If there's no code, there's no lineno
+                return None
         if inspect.istraceback(obj): obj = obj.tb_frame
         if inspect.isframe(obj): obj = obj.f_code
         if inspect.iscode(obj):
index 0a2a016fff13e5a4bf63998eeb83eb037ee78361..f71d62cc174d6b9a795262310c82df95b2128c61 100644 (file)
@@ -2553,6 +2553,20 @@ def test_look_in_unwrapped():
     'one other test'
     """
 
+@doctest_skip_if(support.check_impl_detail(cpython=False))
+def test_wrapped_c_func():
+    """
+    # https://github.com/python/cpython/issues/117692
+    >>> import binascii
+    >>> from test.test_doctest.decorator_mod import decorator
+
+    >>> c_func_wrapped = decorator(binascii.b2a_hex)
+    >>> tests = doctest.DocTestFinder(exclude_empty=False).find(c_func_wrapped)
+    >>> for test in tests:
+    ...    print(test.lineno, test.name)
+    None b2a_hex
+    """
+
 def test_unittest_reportflags():
     """Default unittest reporting flags can be set to control reporting
 
diff --git a/Misc/NEWS.d/next/Library/2024-04-09-23-22-21.gh-issue-117692.EciInD.rst b/Misc/NEWS.d/next/Library/2024-04-09-23-22-21.gh-issue-117692.EciInD.rst
new file mode 100644 (file)
index 0000000..98a6e12
--- /dev/null
@@ -0,0 +1,2 @@
+Fixes a bug when :class:`doctest.DocTestFinder` was failing on wrapped
+``builtin_function_or_method``.