没有主要功能时,为什么sys.settrace不启动?

时间:2019-05-06 03:33:41

标签: python

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 +

1 个答案:

答案 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