散列Python函数

时间:2014-10-28 18:17:53

标签: python function caching python-3.x hash

def funcA(x):
    return x

funcA.__code__.__hash__()是否适合检查funcA是否已更改?

我知道funcA.__hash__()不会像id(funcA) / 16那样有效。我检查过,__code__.__hash__()不是这样。我还测试了ipython终端中的行为,它似乎成立了。但是这可以保证有效吗?

为什么

我想有一种方法可以将旧版本的函数与同一函数的新版本进行比较。

我正在尝试为基于磁盘的/长期缓存创建装饰器。因此,我需要一种方法来识别函数是否已更改。我还需要查看调用图以检查所有被调用的函数是否都已更改,但这不是此问题的一部分。

要求:

  • 需要在多个电话和机器上保持稳定。 1表示在Python 3.3中,hash()在新实例的每个开始时都是随机的。虽然它也说“HASH RANDOMIZATION被默认禁用”。理想情况下,即使启用了随机化,我也希望功能稳定。
  • 理想情况下,它会为def funcA: passdef funcB: pass产生相同的哈希值,即仅当函数名称发生更改时。可能没必要。
  • 我只关心Python 3。

一种替代方法是在包含给定函数的文件内散列文本。

1 个答案:

答案 0 :(得分:0)

  1. 是的,似乎func_a.__code__.__hash__()对于代码的特定功能是唯一的。我无法找到实现的位置,或__code__.__hash__()定义的位置。

  2. 完美的方法是使用func_a.__code__.co_code.__hash__()因为co_code将字节代码作为字符串。请注意,在这种情况下,函数名称不是散列的一部分,并且具有相同代码但名称为func_afunc_b的两个函数将具有相同的散列。

    hash(func_a.__code__.co_code)
    
  3. Source