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

questionAnswers(2)

yourAnswerToTheQuestion