This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2011年05月04日 01:58 by nedbat, last changed 2022年04月11日 14:57 by admin.
| Messages (3) | |||
|---|---|---|---|
| msg135089 - (view) | Author: Ned Batchelder (nedbat) * (Python triager) | Date: 2011年05月04日 01:58 | |
The docs say:
The trace function is invoked (with event set to 'call') whenever a new local scope is entered; it should return a reference to a local trace function to be used that scope, or None if the scope shouldn’t be traced.
The local trace function should return a reference to itself (or to another function for further tracing in that scope), or None to turn off tracing in that scope.
It's that last part that's wrong: returning None from the trace function only has an effect on the first call in a new frame. Once the trace function returns a function for a frame, returning None from subsequent calls is ignored. A "local trace function" can't turn off tracing in its scope.
To demonstrate:
import sys
UPTO_LINE = 1
def t(frame, event, arg):
num = frame.f_lineno
print("line %d" % num)
if num < UPTO_LINE:
return t
def try_it():
print("twelve")
print("thirteen")
print("fourteen")
print("fifteen")
UPTO_LINE = 1
sys.settrace(t)
try_it()
UPTO_LINE = 13
sys.settrace(t)
try_it()
Produces:
line 11
twelve
thirteen
fourteen
fifteen
line 11
line 12
twelve
line 13
thirteen
line 14
fourteen
line 15
fifteen
line 15
The first call to try_it() returns None immediately, preventing tracing for the rest of the function. The second call returns None at line 13, but the rest of the function is traced anyway. This behavior is the same in all versions from 2.3 to 3.2, in fact, the 100 lines of code in sysmodule.c responsible for Python tracing functions are completely unchanged through those versions.
|
|||
| msg206739 - (view) | Author: Xavier de Gaye (xdegaye) * (Python triager) | Date: 2013年12月21日 14:07 | |
See also issue 20040. |
|||
| msg285720 - (view) | Author: Armin Rigo (arigo) * (Python committer) | Date: 2017年01月18日 11:32 | |
Confirmed. More interestingly, nowadays (at least in 3.5) test_pdb.py depends on this bug. If we really clear f->f_trace when the trace function returns None, then test_pdb_until_command_for_generator() fails. This is because pdb.py incorrectly thinks there is no breakpoint in the generator function, and returns None. This doesn't actually clear anything, and so it works anyway. I'd suggest to fix the documentation to reflect the actual behavior of all versions from 2.3 to (at least) 3.5. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:16 | admin | set | github: 56201 |
| 2017年01月18日 11:32:14 | arigo | set | nosy:
+ arigo messages: + msg285720 |
| 2013年12月21日 14:07:05 | xdegaye | set | nosy:
+ xdegaye messages: + msg206739 |
| 2011年05月04日 02:03:44 | nedbat | set | assignee: nedbat |
| 2011年05月04日 01:58:53 | nedbat | create | |