Wytrawianie statycznej metody w Pythonie

Próbowałem ukradnąć obiekt, który zawiera odwołania do metod klas statycznych. Pickle zawodzi (na przykład namodule.MyClass.foo) stwierdzając, że nie można go wytrawić, jakmodule.foo nie istnieje.
Wymyśliłem następujące rozwiązanie, używając obiektu wrapper do zlokalizowania funkcji po wywołaniu, zapisując klasę kontenera i nazwę funkcji:

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)

Zastanawiam się jednak, czy istnieje lepszy - bardziej standardowy sposób - marynowanie takiego obiektu? Nie chcę wprowadzać zmian w globalnympickle proces (przy użyciucopy_reg na przykład), ale następujący wzór byłby świetny: class MyClass (obiekt): @picklable_staticmethod def foo (): print "done."

Moje próby tego nie powiodły się, szczególnie dlatego, że nie mogłem wyodrębnić klasy właściciela zfoo funkcjonować. Byłem nawet skłonny zaakceptować wyraźną specyfikację (taką jak@picklable_staticmethod(MyClass)), ale nie wiem, w jaki sposób odnieść się doMyClass klasa dokładnie tam, gdzie jest zdefiniowana.

Wszelkie pomysły byłyby świetne!

Yonatan

questionAnswers(2)

yourAnswerToTheQuestion