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