Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
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 anddecorate.py.
Contents ofmain.py:
fromdecorateimportdecorator@decoratordeffoo():""" >>> foo() 2 """return42
Contents ofdecorate.py:
importfunctoolsdefdecorator(f):@functools.wraps(f)definner():returnf()returninner
If we run a doctest like so:python3 -m doctest main.py, we find the errorcorrectly 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.fooFailed example: foo()Expected: 2Got: 42**********************************************************************1 items had failures: 1 of 2 in main.foo***Test Failed*** 1 failures.Incorrect Output
However, if we move thedecorator definition in thedecorate.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.
importfunctoolsdefdecorator(f):@functools.wraps(f)definner():returnf()returninner
Traceback:
**********************************************************************File "/codemill/chaudhat/learning/demo/main.py", line ?, in main.fooFailed example: foo()Expected: 2Got: 42**********************************************************************1 items had failures: 1 of 1 in main.foo***Test Failed*** 1 failures.PS: If move thedecorator 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 indoctest.py.
CPython versions tested on:
3.11
Operating systems tested on:
Linux