我正在尝试编写一些代码来为每个返回不同输出的函数调用生成唯一的哈希值。该函数是确定性的,其输出值仅取决于输入参数。
import os
import functools
import hashlib
import numpy as np
import inspect
def generate_hash(dictionary):
args = []
for key,item in dictionary.iteritems():
if key == 'self': continue
if isinstance(item,functools.partial):
args.append((key,inspect.getsourcelines(item.func),
generate_hash(item.keywords)))
elif inspect.isfunction(item):
args.append((key,inspect.getsourcelines(item),generate_hash(item.__dict__)))
elif isinstance(item,np.ndarray):
args.append((key,item.data))
else:
args.append((key,item))
return hashlib.sha224(str(args)).hexdigest()
class Foo(object):
def __init__(self, axis):
super(Foo, self).__init__()
self.axis = axis
self.ft_func = lambda ft: np.mean(ft,axis = self.axis)
def extract(self,ft,ft_func):
_cache = generate_hash(locals())
if os.path.isfile(_cache):
# Load data from cache
else:
# Compute data, cache
return _cache
从示例中可以看出,对于ft
的不同值,extract
返回的哈希值将发生变化。但修改Foo(axis=X)
的值不会影响它。原因是,我需要在generate_hash中确定ft_func
的const值,并使用它们来创建哈希值。
例如:
foo = Foo(1)
print foo.extract(1,ft_func=foo.ft_func) -> 1a72fe1d0...
foo = Foo(2)
print foo.extract(1,ft_func=foo.ft_func) -> 1a72fe1d0...
foo = Foo(2)
print foo.extract(2,ft_func=foo.ft_func) -> 504307731...
我在没有找到解决方案的情况下彻底阅读了模块inspect的文档。
有什么建议吗?
Python memoization :在另一个线程上指出,是的,它是相同的想法,但我找不到在不同会话中持久的实现。