Repository navigation
Incorrect code collapse while prompting where the error is. #128327
Copy link
Copy link
Open
Labels
stdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
Read the following code:
# incorrect_collapse.py
def fib(number: int) -> int:
assert number > 0
if number == 1:
return 1
return fib(number - 1) + fib(number - 2) # Notice here
print(fib(2))There is a mistake in the code above, so if you try to run it, you will get the following traceback:
PC-Killer@ArchLinuxPC ~/p/bugs> python incorrect_collapse.py
Traceback (most recent call last):
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 9, in <module>
print(fib(2))
~~~^^^
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 6, in fib
return fib(number - 1) + fib(number - 2) # Notice here
~~~^^^^^^^^^^^^
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 2, in fib
assert number > 0
^^^^^^^^^^
AssertionError
Notice that the error happened while running the code fib(number - 2).
However, if the number is 5, the duplicate code will be automatically collapsed:
# incorrect_collapse.py
def fib(number: int) -> int:
assert number > 0
if number == 1:
return 1
return fib(number - 1) + fib(number - 2) # Notice here
print(fib(5))PC-Killer@ArchLinuxPC ~/p/bugs [1]> python incorrect_collapse.py
Traceback (most recent call last):
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 9, in <module>
print(fib(5))
~~~^^^
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 6, in fib
return fib(number - 1) + fib(number - 2) # Notice here
~~~^^^^^^^^^^^^
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 6, in fib
return fib(number - 1) + fib(number - 2) # Notice here
~~~^^^^^^^^^^^^
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 6, in fib
return fib(number - 1) + fib(number - 2) # Notice here
~~~^^^^^^^^^^^^
[Previous line repeated 1 more time]
File "/home/PC-Killer/python_work/bugs/incorrect_collapse.py", line 2, in fib
assert number > 0
^^^^^^^^^^
AssertionError
The error happened in fib(number - 2). However, in the traceback above, I can only suppose the error happened while running fib(number - 1), which increases the time to find where the real bug is.
CPython versions tested on:
3.13, 3.14
Operating systems tested on:
Linux
Linked PRs
Metadata
Metadata
Assignees
Labels
stdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
- StatusShow more project fieldsTodo
Activity
picnixz commentedon Dec 29, 2024
This the the expected behaviour. Because we are running
fib(4)beforefib(3), we'll seefib(4)raising. If you writefib(2)you executefib(1)andfib(0). but it'sfib(0)that is having an issue, notfib(1)(it immediately returns).If you unroll the calls you have:
So it's normal that
fib(n-2)is the error location. Forfib(5), if you unroll the call you have:So the error happened in the n-2 inner branch of the top n-1 branch. It would also fail on the n-2 inner branch of the top n-2 branch but this n-2 branch wouldn't be even executed yet.
This can be verified as follows:
This wil print:
PC-Killer commentedon Dec 29, 2024
Thanks for reading my issue! I am sorry that I may have not explained myself clearly.
Please notice your output above:
That is to say, while calculating fib(2), the former, fib(number - 1) has been calculated successfully, and the mistake happened while calculating fib(number - 2), which refers to fib(0)
Therefore, in my opinion, the traceback should be like the following:
picnixz commentedon Dec 29, 2024
Ah I see what you mean. I think the issue is that we are considering the traceback to be identical because we haven't yet added the markers (
^). I'm not on my dev session so it's a bit hard to investigate, but we should decide if the rendered lines are the same by also checking where the carrets would be rendered before hiding them.For instance,
fib(4)shows:cc @pablogsal
picnixz commentedon Jan 23, 2025
@pablogsal I guess it's a traceback issue (or maybe an interpreter core issue, I don't really know in this case)
pablogsal commentedon Jan 23, 2025
Is a traceback module issue (the repl topic normally is for thing is pyrepl)