[英]How do I check if a python function changed (in live code)?
如果我有一个函数的引用,我可以检查它的代码对象f.__code__
,获取签名,然后对此签名执行后续检查以查看代码是否更改。 这很好。 但是,如果其中一个功能的依赖项发生了变化呢? 例如
def foo(a, b):
return bar(a, b)
让我们说foo
保持不变,但是bar
改变了。 有没有办法可以通过foo.__code__
对象检查foo
的依赖“live”(与解析文本和使用AST相比)?
我只是在这里查看__code__
对象,所以我不能说这肯定会起作用,但它看起来像你可以使用co_names
元组来(递归地)遍历以特定函数为根的调用图,为了建立某种可能被调用的函数的传递闭包的哈希。 (我认为不可能仅包括将为特定输入调用的函数,但您可以保守并包括所有可能的调用。)
为此,您需要维护某种符号表,以便能够查找被调用函数的名称。 但是一旦你开始沿着这条路走下去,看起来你基本上都会建立自己的AST等价物。 那么,为什么不直接使用AST呢?
您可以使用method.__code__.co_code
来比较代码对象上的字节码属性。 例如,让我们定义两个类:
>>> class A:
... a = 1
... def b(self, b):
... print(self.a + b)
...
>>> class B:
... a = 1
... def b(self, b):
... print(self.a + b)
...
>>> A().b.__code__.co_code
'|\x00\x00j\x00\x00|\x01\x00\x17GHd\x00\x00S'
>>> B().b.__code__.co_code
'|\x00\x00j\x00\x00|\x01\x00\x17GHd\x00\x00S'
>>> A().b.__code__.co_code == B().b.__code__.co_code
True
如果A
类中A
方法b
改变了:
>>> class A:
... a = 1
... def b(self, b):
... print(b + self.a)
...
>>> A().b.__code__.co_code
'|\x01\x00|\x00\x00j\x00\x00\x17GHd\x00\x00S'
>>> A().b.__code__.co_code == B().b.__code__.co_code
False
或使用inspect方法inspect.getsource(object)
:
返回对象的源代码文本。 参数可以是模块,类,方法,函数,回溯,框架或代码对象。 源代码作为单个字符串返回。
如果你想知道代码是否在动态变化,你可能需要用importlib
重新加载你的类并比较字节码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.