정적 클래스 메서드에 대한 참조를 포함하는 개체를 피클링하려고했습니다. 피클은 절임 될 수 없다는 진술서 (예 : module.MyClass.foo
)와 일치하지 않습니다. module.foo
은 존재하지 않습니다. 더 표준적인 방법 - 더 나은가, 그래도 궁금Python에서 정적 메서드 pickling
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)
:
나는 컨테이너 클래스와 함수 이름을 저장, 호출시 기능을 찾을 래퍼 객체를 사용하여 다음과 같은 솔루션과 함께 올라와있다 - 그런 피클 피클? I (예 : copy_reg
사용) 글로벌 pickle
과정을 변경하지 않지만, 다음과 같은 패턴은 좋은 것 : MyClass 클래스 (객체) : @picklable_staticmethod 데프 foo는() ". 다" 인쇄
내 시도는 성공하지 못했습니다. 특히 foo
함수에서 소유자 클래스를 추출 할 수 없었기 때문입니다. 심지어는 명시 적 사양 (예 : @picklable_staticmethod(MyClass)
)으로 해결할 의향이 있었지만 정의되고있는 곳의 MyClass
클래스를 참조하는 방법을 알지 못합니다.
모든 아이디어가 우수 할 것입니다.
요나탄
원래 클래스는 사용할 수 없습니다. (나는 생각합니다) 정적 메서드를 산정 및 unpickling의 목적을 패배 - 당신은 그것을 절어 수 있지만 전체 클래스를 unpickle 필요합니다. 수입 피클 MyClass 클래스 (객체) : 절인 =의 pickle.dumps (MyClass.dosomething) 델 B, 인쇄 A : 가 데프 (A, B)을 해봐요 @PickleableStaticMethod –
는 예를 들어 것을 시도 MyClass stm = pickle.loads (절임) –
나는 그저 완전히 잘못된 것을 말했을 것이고, pickle은 내가 기대했던 funcs와 완전히 다른 것으로 생각한다. 최근의 두 코멘트를 무시하십시오. -/ –