我希望能够跟踪Python函数访问哪些全局变量。我第一次尝试这样做涉及创建dict
的子类,该子类将其调用记录到__getitem__
和__setitem__
,并使用globals
构建一个新函数。
这种类型有点适用于Python 3(虽然我还没有让内置工作正常工作)。但是,looks like这在Python 2中根本不起作用,因为CPython直接在全局变量上调用PyDict_SetItem()
而不是PyObject_SetItem()
。
在Python 2中做同样事情的最佳方法是什么?我是否只需检查LOAD_GLOBAL
指令的字节码,还是有更好的方法?
LOAD_GLOBAL
方法的一个缺点是我无法检测函数是否实际访问全局变量 - 例如,如果只访问全局foo
一个分支,上面详述的方法可以判断该分支是否已执行,而字节码读取则不会。另一个缺点是,它无法通过globals()[bar]
捕获变量访问。这些对我来说相当小,但解决它们会很好。