我正在尝试创建一个简单的中间编译函数:
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调用的函数。我在寻找理论上可能吗?有合理的中间立场吗?
答案 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")