1

我正在尝试制作一个简单的中间编译功能:

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

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

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

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

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

4

2 回答 2

2

除了存储 lambda,您可以存储函数参数元组的列表,func_code并对这些函数进行哈希处理。也就是说,而不是你所拥有的,做:

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 版本之间发生变化。

于 2012-12-04T04:37:34.657 回答
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")
于 2012-12-04T04:36:32.707 回答