import sys
def printer(frame, event, arg):
print(frame, event, arg)
return printer
sys.settrace(printer)
x = 1
sys.settrace(None)
上面的代码不会打印任何内容。 https://repl.it/@laike9m/settrace
如果我创建一个主函数并将x = 1
放入其中,一切将按预期运行
import sys
def printer(frame, event, arg):
print(frame, event, arg)
return printer
sys.settrace(printer)
def main():
x = 1
if __name__ == '__main__':
main()
sys.settrace(None)
# outputs
# <frame object at 0x7f16e5264d88> call None
# <frame object at 0x7f16e5264d88> line None
# <frame object at 0x7f16e5264d88> return None
https://repl.it/@laike9m/settracehasmain
我正在使用Python 3.6 +
答案 0 :(得分:3)
文档时间!
>>> import sys
>>> help(sys.settrace)
settrace(...)
settrace(function)
Set the global debug tracing function. It will be called on each
function call. See the debugger chapter in the library manual.
此处的关键短语是“ 函数调用”。 main()
是一个函数调用。 x = 1
不是。简而言之,sys.settrace
确实会触发,但在没有函数调用时不会调用跟踪函数。
有趣的是,official docs用不同的词表示:
调用跟踪功能(将 event 设置为
'call'
)每当输入新的本地范围时;它应该返回对该范围要使用的本地跟踪函数的引用;如果不应该跟踪该范围,则返回None
。
(添加了强调。)
由于调用函数进入本地范围,因此将调用跟踪函数。但是除了调用函数外,文档还指出其他形式的本地范围也可以工作:
import sys
def printer(frame, event, arg):
print(frame, event, arg)
return printer
sys.settrace(printer)
class A:
print(1)
sys.settrace(None)
输出:
<frame at 0x7fa020e04948, file '/Users/TrebledJ/Library/Preferences/PyCharmCE2019.1/scratches/scratch.py', line 10, code A> call None
<frame at 0x7fa020e04948, file '/Users/TrebledJ/Library/Preferences/PyCharmCE2019.1/scratches/scratch.py', line 10, code A> line None
<frame at 0x7fa020e04948, file '/Users/TrebledJ/Library/Preferences/PyCharmCE2019.1/scratches/scratch.py', line 11, code A> line None
1
<frame at 0x7fa020e04948, file '/Users/TrebledJ/Library/Preferences/PyCharmCE2019.1/scratches/scratch.py', line 11, code A> return None