我想根据函数的参数生成一个哈希值(用于一些快速自动缓存)。哈希应该在不同的会话之间保持一致。
我们假设我有以下功能:
def generate_hash(dictionary):
return hashlib.sha224(str(dictionary.items())).hexdigest()
def foo(a,b,c):
return generate_hash(locals())
只要参数str
表示在会话中保持一致,这就完全没问题。问题是我经常将函数作为参数传递,看起来并非如此。
例如,以下调用将在会话中返回不同的结果。
foo(1,2,np.sum)
任何解决方法?
答案 0 :(得分:0)
好像我自己想出了一些东西:
16 def generate_hash(dictionary):
17 args = []
18 for key,item in dictionary.iteritems():
19 if isinstance(item,functools.partial):
20 args.append((key,item.func.__module__,item.func.__name__,
21 generate_hash(item.keywords)))
22 elif inspect.isfunction(item):
23 args.append((key,item.__module__,item.__name__))
24 else:
25 args.append((key,item))
26 return hashlib.sha224(str(args)).hexdigest()
也与部分功能一致:
foo('a','1',np.average) -> 1631c5fd0050fd01cb7a7ee9666d366b35c1415cb4181c7220ead043
foo('a',1,functools.partial(np.average,axis=0)) -> 692227d3b52b0cdcd4ed2204650cb207c1ab6f274a09977c711d35d5
foo('a',1,functools.partial(np.average,axis=1)) -> ba1e0b01f2e12ef1c9ca2e3bf5235aaadcbe4ab29d9c977e1ee6e799