copyreg — pickle 지원 함수 등록

copyreg — pickle 지원 함수 등록

copyreg 모듈은 특정 객체를 pickling할 때 사용되는 함수를 정의하는 방법을 제공합니다. picklecopy 모듈이 해당 객체를 pickling/copying할 때 이 함수들을 사용합니다. 이 모듈은 클래스가 아닌 객체 생성자(constructor)에 대한 설정 정보를 제공하는데, 그러한 생성자는 팩토리 함수나 클래스 인스턴스일 수 있습니다.

출처: Python documentation

본문

copyreg.constructor(object)object를 유효한 생성자로 선언합니다. object가 호출 가능하지 않으면(따라서 생성자로 유효하지 않으면) TypeError를 발생시킵니다.

copyreg.pickle(type, function, constructor_ob=None)functiontype 타입의 객체에 대한 "reduction" 함수로 사용되어야 한다고 선언합니다. function은 문자열이거나 2에서 6개의 요소를 담은 튜플을 반환해야 합니다. function 인터페이스의 자세한 내용은 dispatch_table을 참고하세요.

constructor_ob 매개변수는 레거시 기능이며 이제 무시되지만, 전달된다면 호출 가능해야 합니다. 또한 pickler 객체나 pickle.Pickler의 서브클래스의 dispatch_table 속성으로 reduction 함수를 선언할 수도 있습니다.

예를 들어, pickle 함수를 등록하고 그것이 어떻게 사용되는지 보여주는 코드는 다음과 같습니다:

>>> import copyreg, copy, pickle
>>> class C:
...     def __init__(self, a):
...         self.a = a
...
>>> def pickle_c(c):
...     print("pickling a C instance...")
...     return C, (c.a,)
...
>>> copyreg.pickle(C, pickle_c)
>>> c = C(1)
>>> d = copy.copy(c)
pickling a C instance...
>>> p = pickle.dumps(c)
pickling a C instance...

위 예에서 copyreg.pickle(C, pickle_c)를 등록하면, C 인스턴스를 복사하거나 pickling할 때 pickle_c 함수가 호출되어 "pickling a C instance..."가 출력되는 것을 볼 수 있습니다. pickle_c는 생성자 함수 C와 그 생성자의 인자 튜플 (c.a,)를 반환하므로, 언피클링 시 다시 C를 호출하여 객체를 복원할 수 있습니다.

copyregcopy 모듈과 pickle 모듈의 내부 동작에도 사용됩니다. copy 모듈이 객체를 복사할 때, 객체의 타입에 맞는 reduction 함수가 copyreg에 등록되어 있다면 이를 사용합니다. 이로 인해 두 모듈은 객체를 직렬화/역직렬화하고 복사하는 일관된 방식을 공유할 수 있습니다.

클래스가 아닌 생성자(예: 팩토리 함수나 다른 객체의 인스턴스)를 사용하는 객체 타입의 경우에 특히 copyreg가 유용합니다. 이런 생성자들은 copyreg.constructor()로 등록하여 pickling 시스템에서 유효한 생성자로 인식되게 할 수 있습니다.

더 알아보기 (Learn more)