cpython/Lib/test/test_doctest/doctest_lineno.py
Denis Laxalde fece15d29f
gh-136914: Fix support of cached functions and properties in DocTest's lineno computation (GH-136930)
Previously, DocTest's lineno of functions and methods decorated with
functools.cache(), functools.lru_cache() and functools.cached_property()
was not properly returned (None was returned) because the
computation relied on inspect.isfunction() which does not consider the
decorated result as a function.

We now use the more generic inspect.isroutine(), as elsewhere
in doctest's logic.

Also, added a special case for functools.cached_property().
2025-07-25 12:46:12 +03:00

107 lines
2 KiB
Python

# This module is used in `test_doctest`.
# It must not have a docstring.
def func_with_docstring():
"""Some unrelated info."""
def func_without_docstring():
pass
def func_with_doctest():
"""
This function really contains a test case.
>>> func_with_doctest.__name__
'func_with_doctest'
"""
return 3
class ClassWithDocstring:
"""Some unrelated class information."""
class ClassWithoutDocstring:
pass
class ClassWithDoctest:
"""This class really has a test case in it.
>>> ClassWithDoctest.__name__
'ClassWithDoctest'
"""
class MethodWrapper:
def method_with_docstring(self):
"""Method with a docstring."""
def method_without_docstring(self):
pass
def method_with_doctest(self):
"""
This has a doctest!
>>> MethodWrapper.method_with_doctest.__name__
'method_with_doctest'
"""
@classmethod
def classmethod_with_doctest(cls):
"""
This has a doctest!
>>> MethodWrapper.classmethod_with_doctest.__name__
'classmethod_with_doctest'
"""
@property
def property_with_doctest(self):
"""
This has a doctest!
>>> MethodWrapper.property_with_doctest.__name__
'property_with_doctest'
"""
# 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."""
# https://github.com/python/cpython/issues/136914
import functools
@functools.cache
def cached_func_with_doctest(value):
"""
>>> cached_func_with_doctest(1)
-1
"""
return -value
@functools.cache
def cached_func_without_docstring(value):
return value + 1
class ClassWithACachedProperty:
@functools.cached_property
def cached(self):
"""
>>> X().cached
-1
"""
return 0