在尝试回答另一个问题时,我突然意识到,当理论上您不应该拥有控制权时,您可以在线程中随时运行代码。 CPython 有一个settrace
用于在代码中注册跟踪函数的函数。为了通过使用类来测试这个想法,编写了以下代码。问题是跟踪似乎没有发生,并且跟踪日志中没有生成任何数据。下面所示的代码中出现问题的原因是什么?
#! /usr/bin/env python3
import atexit
import collections
import pprint
import sys
def main():
i = create_instance()
print(len(i.data), flush=True)
def create_instance():
instance = Tracer()
return instance
class Tracer:
def __init__(self):
self.data = []
sys.settrace(self.trace)
atexit.register(pprint.pprint, self.data)
atexit.register(sys.settrace, None)
def trace(self, frame, event, arg):
print('Tracing ...', flush=True)
self.data.append(TraceRecord(frame, event, arg))
return self.trace
TraceRecord = collections.namedtuple('TraceRecord', 'frame, event, arg')
if __name__ == '__main__':
main()
附录:
在 Windows 上运行 Python 3.5 时,该问题并不明显。但是,Python 3.6 中不会进行跟踪,因此不会打印跟踪日志。如果有人可以为我确认该错误是一个很好的答案,那么提交的内容很有可能被接受并获得赏金。
我尝试了你的程序,确实如发布的那样,它没有任何可跟踪的内容。内置函数print()
and len()
不生成跟踪事件,大概是因为它们是由平台定义的,并且假设它们的内部工作正常并且不有趣。
文档指出:
每当进入新的本地作用域时,都会调用跟踪函数(事件设置为“call”);
我修改了你的程序来定义一个函数并调用它。当我这样做时,你的跟踪函数被调用。
我定义的函数:
def doSomething():
print("Hello World")
我的版本是你的main()
功能:
def main():
i = create_instance()
print(len(i.data))
doSomething()
print(len(i.data))
我看到的输出:
0
Tracing ...
Tracing ...
Hello World
Tracing ...
3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)