def funcA(x):
return x
funcA.__code__.__hash__()
是否适合检查funcA
是否已更改?
我知道funcA.__hash__()
不会像id(funcA) / 16
那样有效。我检查过,__code__.__hash__()
不是这样。我还测试了ipython终端中的行为,它似乎成立了。但是这可以保证有效吗?
我想有一种方法可以将旧版本的函数与同一函数的新版本进行比较。
我正在尝试为基于磁盘的/长期缓存创建装饰器。因此,我需要一种方法来识别函数是否已更改。我还需要查看调用图以检查所有被调用的函数是否都已更改,但这不是此问题的一部分。
要求:
hash()
在新实例的每个开始时都是随机的。虽然它也说“HASH RANDOMIZATION被默认禁用”。理想情况下,即使启用了随机化,我也希望功能稳定。def funcA: pass
和def funcB: pass
产生相同的哈希值,即仅当函数名称发生更改时。可能没必要。一种替代方法是在包含给定函数的文件内散列文本。
答案 0 :(得分:0)
是的,似乎func_a.__code__.__hash__()
对于代码的特定功能是唯一的。我无法找到实现的位置,或__code__.__hash__()
定义的位置。
完美的方法是使用func_a.__code__.co_code.__hash__()
因为co_code
将字节代码作为字符串。请注意,在这种情况下,函数名称不是散列的一部分,并且具有相同代码但名称为func_a
和func_b
的两个函数将具有相同的散列。
hash(func_a.__code__.co_code)