copyreg — pickle 지원 함수 등록
copyreg — pickle 지원 함수 등록
copyreg 모듈은 pickle 모듈이 사용자 정의 클래스를 직렬화할 수 있게 해 주는 지원 함수를 등록하는 데 쓰여요. 주로 pickle 모듈과 함께 동작하며, 특정 클래스가 어떻게 pickling·unpickling되는지 사용자 정의할 수 있게 해 줍니다.
출처: Python 표준 라이브러리
본문
지원 함수 등록
copyreg.pickle(ob_type, pickle_function, constructor_ob=None) — 클래스 ob_type에 대해 pickle 함수를 등록해요. pickle_function은 ob_type의 인스턴스를 받아 객체를 다시 만들기 위한 설명 객체(reduction)를 반환해야 해요.
일반적으로 pickle 함수는 인스턴스의 상태를 표현하는 tuple (constructor, args)를 반환합니다. 이때 constructor는 args로 호출하면 원래 객체를 다시 만드는 호출 가능 객체예요. constructor_ob는 unpickling 시 참조할 전역 객체로, constructor 함수의 전역 이름을 저장할 수 있게 해 줍니다.
예를 들어 사용자 정의 클래스가 기본 pickling을 지원하지 못하거나 더 효율적인 직렬화를 원할 때:
import copyreg, pickle
class MyClass:
def __init__(self, value):
self.value = value
def pickle_myclass(obj):
return MyClass, (obj.value,)
copyreg.pickle(MyClass, pickle_myclass)
# 이제 MyClass를 pickle할 수 있다
data = pickle.dumps(MyClass(42))
내장 타입의 확장 포인트
copyreg는 확장(extension) 코드를 등록해 인스턴스를 더 작은 형태로 직렬화할 수도 있어요. C 확장 모듈 등이 copyreg를 통해 self-reduction 콜백을 등록하면, 해당 객체는 상태를 다시 재구성하는 방식으로 pickling됩니다.
참고할 점
copyreg.pickle()로 등록한 이후에는 pickle 모듈이 해당 클래스를 직렬화할 때 등록된 함수를 우선적으로 사용합니다. 등록을 해제하는 별도 API는 없으므로, 원한다면 pickle 함수가 NotImplemented를 반환하거나 프로토콜을 구분해서 동작을 제어해야 해요.
더 알아보기
- 원문: python: copyreg — Register pickle support functions
- pickle — Python 객체 직렬화 — 객체 직렬화와 역직렬화 전반