散列Python函数的代码(包括lambdas)

时间:2012-12-04 04:08:05

标签: python hash lambda

我正在尝试创建一个简单的中间编译函数:

lst = [lambda x: calculate_urls(),
       lambda x: join_urls_with_ids(x, args[0]),
       lambda x: bucket_urls(x)]
intermediate.execute(lst)

intermediate.execute将运行列表中的每个项目。第一个函数的输出是第二个函数的输入,依此类推。 lambdas用于使每个函数只接受一个参数。 (第一个输入值是None,所以这里实际上忽略了它。)

在每个中间步骤中,输出被腌制并保存(目前仅为/tmp)。如果某个函数已存在某个中间输出,则跳过该函数的执行,然后进入下一步。

我正在寻找一种方法来检测功能代码的变化,我认为散列代码将是一种快速的方法。我希望它检测是否有人更改了函数的实现,以便它再次执行该函数并忽略缓存的值。

我发现了func_code,这是可以清洗的AFAIK。但是,它仅适用于该特定函数,这意味着只有在上面代码中的lambdas发生更改时,散列才会更改,而不是lambdas调用的函数。我在寻找理论上可能吗?有合理的中间立场吗?

2 个答案:

答案 0 :(得分:2)

您可以存储函数参数元组的列表,并散列这些函数的func_code,而不是存储lambdas。也就是说,而不是你拥有的,做:

lst = [
    (calculate urls, ()),
    (join_urls_with_ids, (args[0])),
    (bucket_urls, ())
]

然后将intermediate.execute变为:

def execute(lst):
    result = ()
    for func, args in list:
        args = result + args
        result = func(*args)

然而,要抓住你在这里想做的事情有点困难。是否认为函数实现可能在程序的不同调用之间发生变化? (也就是说,运行,保存缓存,退出,更改calculate_urls的源代码,然后再次运行?)如果是这样,您可能最好还是使用inspect.getsource来散列函数的源代码。 Python字节码(这是func_code中的内容)并不是一个稳定的目标,可能会在Python版本之间发生变化。

答案 1 :(得分:0)

如何制作功能的备份列表?如果某事在lst中改变其中一个,则列表将不再相等。

lst = [lambda x: calculate_urls(),
       lambda x: join_urls_with_ids(x, args[0]),
       lambda x: bucket_urls(x)]
backup = list(lst)

lst[0] = lambda x: foo()

if lst != backup:
    print("Something changed")