如何检查python函数是否更改(在实时代码中)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查python函数是否更改(在实时代码中)?相关的知识,希望对你有一定的参考价值。

如果我有一个函数的引用,我可以检查它的代码对象f.__code__,获取签名,然后对此签名执行后续检查以查看代码是否更改。这很好。但是,如果其中一个功能的依赖项发生了变化呢?例如。

def foo(a, b):
    return bar(a, b)

让我们说foo保持不变,但bar改变了。有没有办法可以通过foo对象检查foo.__code__的依赖项'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
'|x00x00jx00x00|x01x00x17GHdx00x00S'
>>> B().b.__code__.co_code
'|x00x00jx00x00|x01x00x17GHdx00x00S'
>>> A().b.__code__.co_code == B().b.__code__.co_code
True

如果类b中的方法A改变了:

>>> class A:
...     a = 1
...     def b(self, b):
...             print(b + self.a)
... 
>>> A().b.__code__.co_code
'|x01x00|x00x00jx00x00x17GHdx00x00S'
>>> A().b.__code__.co_code == B().b.__code__.co_code
False

或使用检查方法inspect.getsource(object)

返回对象的源代码文本。参数可以是模块,类,方法,函数,回溯,框架或代码对象。源代码作为单个字符串返回。

如果你想知道代码是否在动态变化,你可能需要用importlib重新加载你的类并比较字节码。

以上是关于如何检查python函数是否更改(在实时代码中)?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行服务器端实时数据库查询

指针 (*) 如何在以下代码中进行更改?

Python:如何检查日期是不是不明确?

如何编写一个函数来检查模块列表是不是存在,否则在 Python 中安装模块

检查两个 Python 函数是不是相等

如何遍历整个python脚本,并且每次更改订单都会运行