Open
Description
Basically you need to do this:
In particular you need calling_frame.f_trace = previous_trace
in addition to the existing sys.settrace(previous_trace)
.
This is obviously good for restoring the other tracer properly, which I confirmed with the PyCharm debugger. But I stumbled across this because pp
stopped working after with snoop:
exited. It turns out that if you don't reset f_trace
then the frame line number becomes wrong. Here's a demo:
import inspect
import pysnooper
with pysnooper.snoop():
pass
print(inspect.currentframe().f_trace)
print(inspect.currentframe().f_lineno) # wrong lineno
1/0 # wrong lineno in traceback
In particular note the weird traceback:
Traceback (most recent call last):
File "...", line 5, in <module>
pass
ZeroDivisionError: division by zero
Here's a pure python version of the demo:
import inspect
import sys
frame = inspect.currentframe()
frame.f_trace = lambda *_: print('tracing', frame.f_lineno) or frame.f_trace
sys.settrace(frame.f_trace)
# frame.f_trace = None # uncomment to fix
sys.settrace(None)
print('after trace', frame.f_lineno) # wrong lineno
1/0 # wrong lineno in traceback
This is a bug which is apparently fixed in 3.10: https://bugs.python.org/issue42823
Metadata
Metadata
Assignees
Labels
No labels