2010-05-28 4 views
5

(내가 그래서 해결책은 파이썬 3에서 작동 할 필요가 파이썬 3에서 일하고 있어요 명심)이 타입의 감속기를 정의하는 copyreg` 사용파이썬은`이미 감속기가

내가 사용하고자하는

copyreg 모듈은 Python에게 피클을 피클하는 법을 가르쳐줍니다. 내가 시도 할 때 _Pickler 객체는 여전히 save_global 함수를 사용하여 함수를 피클 링하려고합니다. (언 바운드 방법에 대한 작업, 그리고이 일에 대한 의욕의하지 않는.)

당신이 copyreg.dispatch_table에보고하기 전에 피클하려는 개체의 유형에 dispatch 자체에보고 _Pickler 최초의 시도처럼 보인다 . 이것이 의도적인지 확실하지 않습니다.

내가 제공하는 감속기를 사용하여 파이썬에 기능을 피클하도록 말할 수있는 방법이 있습니까? 다음 해킹 파이썬 3.1에서 작동하는 것 같다

답변

1

...이 부족

import copyreg 
def functionpickler(f): 
    print('pickling', f.__name__) 
    return f.__name__ 

ft = type(functionpickler) 
copyreg.pickle(ft, functionpickler) 

import pickle 
pickle.Pickler = pickle._Pickler 
del pickle.Pickler.dispatch[ft] 

s = pickle.dumps(functionpickler) 
print('Result is', s) 

, 두 hackish 라인은 다음과 같습니다

pickle.Pickler = pickle._Pickler 
del pickle.Pickler.dispatch[ft] 

당신은 기능에 대한 dispatch 항목을 제거해야 '형식을 사용합니다. 그렇지 않으면 copyreg 등록을 선점합니다. 파이썬 코드로 설정해야 할 필요가있는 C 코드 Pickler에서 그렇게 할 수 있다고 생각하지 않습니다.

이 만드는 자신의 클래스와 _Pickler을 하위 클래스 해킹의 약간 적은 것 자체 dispatch하고 구체적 서브 클래스를 사용하는 (그리고 (부모와 함수 타입에 대한 항목을 제거가 복사)의 덤프 방법)보다는 pickle.dump; 그러나 피클 자체의이 monkeypatching 또한 조금 덜 편리 할 것입니다.

+0

멋진 해킹. 하지만 정말'_pickle'의 C 속도를 즐기고 싶습니다. –