-
-
Notifications
You must be signed in to change notification settings - Fork 33.2k
Description
Bug report
Bug description:
TL;DR: If a function is decorated, the doctest is unable to find the correct location of the function.
Example
Consider two simple files, main.py and decorate.py.
Contents of main.py:
from decorate import decorator
@decorator
def foo():
"""
>>> foo()
2
"""
return 42Contents of decorate.py:
import functools
def decorator(f):
@functools.wraps(f)
def inner():
return f()
return innerIf we run a doctest like so: python3 -m doctest main.py, we find the error correctly on the line number 7, the line which says >>> foo(). Traceback is output as follows.
**********************************************************************
File "/codemill/chaudhat/learning/demo/main.py", line 7, in main.foo
Failed example:
foo()
Expected:
2
Got:
42
**********************************************************************
1 items had failures:
1 of 2 in main.foo
***Test Failed*** 1 failures.
Incorrect Output
However, if we move the decorator definition in the decorate.py file by a few lines, as shown, (the space between could be empty/defining a function, etc.), we see that the doctest is unable to find the location of the decorated function, foo, and just outputs ? as the line number.
import functools
def decorator(f):
@functools.wraps(f)
def inner():
return f()
return innerTraceback:
**********************************************************************
File "/codemill/chaudhat/learning/demo/main.py", line ?, in main.foo
Failed example:
foo()
Expected:
2
Got:
42
**********************************************************************
1 items had failures:
1 of 1 in main.foo
***Test Failed*** 1 failures.
PS: If move the decorator definition by even a line up, it shows that the line, >>> foo() incorrectly lives on line 10 and not line 7.
Why?
The "?" is printed simply because while doctest is able to find the example's lineno, it is unable to understand the test's lineno. I found this after printing out the line numbers in the _failure_header function in doctest.py.
CPython versions tested on:
3.11
Operating systems tested on:
Linux
Linked PRs
- gh-115392: Fix doctest reporting incorrect line numbers for decorated functions #115440
- [3.11] gh-115392: Fix doctest reporting incorrect line numbers for decorated functions (GH-115440) #115458
- [3.12] gh-115392: Fix doctest reporting incorrect line numbers for decorated functions (GH-115440) #115459