Decapando um método estático em Python
Eu tenho tentado pickle um objeto que contém referências a métodos de classe estáticos. Pickle falha (por exemplo, emmodule.MyClass.foo
) afirmando que não pode ser decapado, comomodule.foo
não existe.
Eu encontrei a seguinte solução, usando um objeto wrapper para localizar a função na chamada, salvando a classe do container e o nome da função:
class PicklableStaticMethod(object):
"""Picklable version of a static method.
Typical usage:
class MyClass:
@staticmethod
def doit():
print "done"
# This cannot be pickled:
non_picklable = MyClass.doit
# This can be pickled:
picklable = PicklableStaticMethod(MyClass.doit, MyClass)
"""
def __init__(self, func, parent_class):
self.func_name = func.func_name
self.parent_class = parent_class
def __call__(self, *args, **kwargs):
func = getattr(self.parent_class, self.func_name)
return func(*args, **kwargs)
Eu estou querendo saber entretanto, há uma maneira melhor - mais padrão - de conservar tal objeto? Eu não quero fazer alterações no globalpickle
processo (usandocopy_reg
por exemplo), mas o seguinte padrão seria ótimo: class MyClass (objeto): @picklable_staticmethod def foo (): print "done".
Minhas tentativas não foram bem-sucedidas, especificamente porque não consegui extrair a classe proprietária dofoo
função. Eu estava até disposto a aceitar especificações explícitas (como@picklable_staticmethod(MyClass)
) mas não sei de nenhuma maneira de me referir aoMyClass
classe certo onde está sendo definido.
Qualquer ideia seria ótima!
Yonatan