Max*_*sin 16 python reflection introspection
如果我有一个函数的引用,我可以检查它的代码对象f.__code__,获取签名,然后对此签名执行后续检查以查看代码是否更改.这很好.但是,如果其中一个功能的依赖项发生了变化呢?例如
def foo(a, b):
return bar(a, b)
Run Code Online (Sandbox Code Playgroud)
让我们说foo保持不变,但bar改变了.有没有办法可以foo通过foo.__code__对象检查'依赖''live' (与解析文本和使用AST)?
我只是在这里研究这个__code__对象,所以我不能说这肯定有效,但在我看来,您可以使用元co_names组(递归地)遍历以特定函数为根的调用图,在为了构建可能被调用的函数的传递闭包的某种哈希值。(我认为不可能只包含为特定输入调用的函数, 但您可以保守一点并包含每个可能的调用。)
为此,您需要维护某种符号表,以便能够查找被调用的函数的名称。但是,一旦您开始沿着这条路走下去,您似乎基本上就会构建自己的 AST 等价物。那么,为什么不直接使用 AST 来开始呢?