2012-03-20 65 views
0

我想缓存一个python方法的输出,所以对于缓存键我使用散列(方法)+序列化的参数。我为多个工作机器使用单个memcached服务器。Python独特的方法标识符

问题是,散列(方法)已被证明在这些工作机器和进程中不一致。

class Foo(object): 
    def bar(): 
     pass 

x = Foo() 
hash(x.bar) #was inconsistent across machines/processes 

id()将无法工作,因为这是一个内存位置,因此只能在一台机器上工作。

谢谢!

+0

@delnan:哦,我们哈希函数... Nvm – 2012-03-20 20:38:31

+0

@NiklasB。你有什么建议我采取的MD5哈希?该函数采用字符串输入... – djs22 2012-03-20 20:40:26

+0

djs22:参数和某种完全限定的函数名称。这已经是一个已解决的问题,但请查看第二个答案中提供的链接。 – 2012-03-20 20:42:26

回答

1
+0

谢谢dgorissen!我最终使用1stvamp的github中的代码作为编写正确实现的完全限定函数名称的基础。 – djs22 2012-03-21 00:20:57

1

我会使用函数的名称来代替,如x.foo.__name__

+0

是的,但在不同的类/模块中具有相同名称的函数呢? – djs22 2012-03-20 20:39:23

+0

@ djs22:在这种情况下,显然你也应该包含模块/类名。 – 2012-03-20 20:41:14

+0

如果你要根据他们的名字对它们进行哈希处理,那么不要给函数同名? – kindall 2012-03-20 20:41:14

1

设置一个名称延伸功能,将采取类名和方法名来创建一个字符串,然后取散了串。例如,让x为方法然后

def method_hash(x): 
    return hash("{0}.{1}".format(x.__objclass__.__name__, x.__name__)) 

这假定该方法是从类而不是一个特定的对象。如果来自对象,则可以使用x.__self__.__name__

+0

函数的'__class__'是'',至少在3.x中(它*可能*在2.x中以其“未绑定的方法”工作,但我不打赌)。 – delnan 2012-03-20 20:49:11

+0

@delnan谢谢你在'__class__'上发现我的错误,我编辑了我的答案来处理它。 – 2012-03-20 21:26:48

+0

一个很好的答案,但由于在原始问题中没有指定原因(我需要在装饰器中生成这个唯一标识符),所以并不总是很容易判断您是在类/对象/还是在模块中。 – djs22 2012-03-21 00:24:30