types — 동적 타입 생성과 내장 타입의 이름

types — 동적 타입 생성과 내장 타입의 이름

이 모듈은 새 타입을 동적으로 생성하는 데 도움을 주는 유틸리티 함수를 정의해요. 또한 표준 Python 인터프리터가 사용하지만 intstr처럼 내장(builtin)으로 노출되지 않는 일부 객체 타입의 이름도 정의해요. 마지막으로 내장이 될 만큼 근본적이지 않은 추가 타입 관련 유틸리티 클래스와 함수를 제공해요.

출처: Python documentation

본문

동적 타입 생성 (Dynamic Type Creation)

types.new_class(name, bases=(), kwds=None, exec_body=None)

적절한 메타클래스를 사용해 클래스 객체를 동적으로 생성해요. 처음 세 인자는 클래스 정의 헤더를 구성하는 요소들, 즉 클래스 이름, 기본 클래스들(순서대로), 키워드 인자들(예: metaclass)이에요. exec_body 인자는 새로 생성된 클래스 네임스페이스를 채우는 데 사용되는 콜백이에요. 클래스 네임스페이스를 유일한 인자로 받아들여 클래스 내용으로 네임스페이스를 직접 업데이트해야 해요. 콜백이 제공되지 않으면 lambda ns: None을 전달하는 것과 같은 효과예요. 버전 3.3에서 추가되었어요.

types.prepare_class(name, bases=(), kwds=None)

적절한 메타클래스를 계산하고 클래스 네임스페이스를 생성해요. 인자는 클래스 정의 헤더를 구성하는 요소들, 즉 클래스 이름, 기본 클래스들(순서대로), 키워드 인자들(예: metaclass)이에요. 반환값은 3-tuple: metaclass, namespace, kwds예요. metaclass는 적절한 메타클래스, namespace는 준비된 클래스 네임스페이스, kwds는 전달된 kwds 인자에서 'metaclass' 항목을 제거한 업데이트된 사본이에요. kwds 인자가 전달되지 않으면 빈 dict예요. 버전 3.3에서 추가되었어요.

types.resolve_bases(bases)

PEP 560에 지정된 대로 MRO 항목을 동적으로 해석해요. 이 함수는 bases에서 type의 인스턴스가 아닌 항목을 찾고, 각각 __mro_entries__() 메서드를 가진 객체를 이 메서드 호출의 펼쳐진 결과로 대체한 튜플을 반환해요. bases 항목이 type의 인스턴스이거나 __mro_entries__() 메서드가 없으면 그대로 반환 튜플에 포함돼요. 버전 3.7에서 추가되었어요.

types.get_original_bases(cls, /)

어떤 bases__mro_entries__() 메서드가 호출되기 전에 cls의 bases로 원래 주어진 객체의 튜플을 반환해요(PEP 560의 메커니즘을 따름). 이는 Generics를 검사(introspect)하는 데 유용해요. __orig_bases__ 속성이 있는 클래스는 cls.__orig_bases__의 값을, 없는 클래스는 cls.__bases__를 반환해요. 버전 3.12에서 추가되었어요.

>>> from typing import TypeVar, Generic, NamedTuple, TypedDict
>>> T = TypeVar("T")
>>> class Foo(Generic[T]): ...
>>> class Bar(Foo[int], float): ...
>>> get_original_bases(Bar)
(Foo[int], float)

표준 인터프리터 타입 (Standard Interpreter Types)

이 모듈은 Python 인터프리터를 구현하는 데 필요한 많은 타입의 이름을 제공해요. 이 이름들의 일반적인 용도는 isinstance() 또는 issubclass() 검사예요. 이 타입 중 하나를 인스턴스화하면 시그니처가 Python 버전마다 다를 수 있다는 점에 주의하세요. 표준 이름은 다음 타입에 대해 정의돼요:

  • types.NoneTypeNone의 타입. (버전 3.10에서 추가)
  • types.FunctionType / types.LambdaType — 사용자 정의 함수와 lambda 표현식으로 만든 함수의 타입
  • types.GeneratorType — 제너레이터 함수로 생성되는 generator-iterator 객체의 타입
  • types.CoroutineTypeasync def 함수로 생성되는 코루틴 객체의 타입. (버전 3.5에서 추가)
  • types.AsyncGeneratorType — 비동기 제너레이터 함수로 생성되는 비동기 generator-iterator 객체의 타입. (버전 3.6에서 추가)
  • **types.CodeType(kwargs)compile()이 반환하는 것 같은 코드 객체의 타입
  • types.CellType — 함수의 클로저 변수 컨테이너로 사용되는 cell 객체의 타입. (버전 3.8에서 추가)
  • types.MethodType — 사용자 정의 클래스 인스턴스의 메서드 타입
  • types.BuiltinFunctionType / types.BuiltinMethodTypelen()이나 sys.exit() 같은 내장 함수와 내장 클래스 메서드의 타입("내장"은 "C로 작성됨"을 의미해요)
  • types.WrapperDescriptorTypeobject.__init__()이나 object.__lt__() 같은 일부 내장 데이터 타입과 기본 클래스 메서드의 타입. (버전 3.7에서 추가)
  • types.MethodWrapperType — 일부 내장 데이터 타입과 기본 클래스의 바운드 메서드 타입. (버전 3.7에서 추가)
  • types.NotImplementedTypeNotImplemented의 타입. (버전 3.10에서 추가)
  • types.MethodDescriptorTypestr.join() 같은 일부 내장 데이터 타입 메서드의 타입. (버전 3.7에서 추가)
  • types.ClassMethodDescriptorTypedict.__dict__['fromkeys'] 같은 일부 내장 데이터 타입의 언바운드 클래스 메서드 타입. (버전 3.7에서 추가)
  • types.ModuleType(name, doc=None) — 모듈의 타입. 생성자는 생성할 모듈의 이름과 선택적으로 docstring을 받아요. ModuleType 생성자로 만든 모듈은 많은 특수 속성이 설정되지 않거나 기본값으로 설정된 상태로 생성돼요. importlib.util.module_from_spec()은 다양한 속성이 적절히 설정되도록 보장하는 더 견고한 ModuleType 생성 방법을 제공해요.
  • types.EllipsisTypeEllipsis의 타입. (버전 3.10에서 추가)
  • types.GenericAlias(t_origin, t_args)list[int] 같은 매개변수화된 제네릭의 타입. t_originlist, tuple, dict 같은 비매개변수화 제네릭 클래스여야 하고, t_argst_origin을 매개변수화하는 타입의 (길이가 1일 수 있는) 튜플이에요. (버전 3.9에서 추가)
  • types.UnionType — 유니언 타입 표현식의 타입. (버전 3.10에서 추가; 버전 3.14에서 typing.Union의 별칭이 됨)
  • types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)sys.exception().__traceback__에서 찾을 수 있는 traceback 객체의 타입
  • types.FrameTypetb.tb_frame에서 찾을 수 있는 프레임 객체의 타입
  • types.GetSetDescriptorTypePyGetSetDef를 사용해 확장 모듈에서 정의한 객체(FrameType.f_localsarray.array.typecode 같은)의 타입
  • types.MemberDescriptorTypePyMemberDef를 사용해 확장 모듈에서 정의한 객체(datetime.timedelta.days 같은)의 타입. __slots__로 클래스를 정의하면 각 슬롯에 대해 MemberDescriptorType 인스턴스가 클래스 속성으로 추가돼 슬롯이 클래스의 __dict__에 나타나게 해요.
  • **types.MappingProxyType(mapping)** — 매핑의 읽기 전용 프록시. 매핑 항목의 동적 뷰를 제공해, 매핑이 바뀌면 뷰도 그 변경을 반영해요. key in proxy, proxy[key], iter(proxy), len(proxy), copy(), get(key[, default]), items(), keys(), values(), reversed(proxy), hash(proxy)`를 지원해요.
  • types.CapsuleType — 캡슐(capsule) 객체의 타입. (버전 3.13에서 추가)

추가 유틸리티 클래스와 함수 (Additional Utility Classes and Functions)

classtypes.SimpleNamespace

속성 접근과 의미 있는 repr을 제공하는 간단한 객체 하위 클래스예요. object와 달리 SimpleNamespace에서는 속성을 추가하고 제거할 수 있어요. SimpleNamespace 객체는 dict와 같은 방식으로, 키워드 인자, 단일 위치 인자, 또는 둘 다로 초기화할 수 있어요. 모든 키는 문자열이어야 해요. class NS: pass의 대체물로 유용할 수 있지만, 구조화된 레코드 타입에는 namedtuple()을 사용하세요. SimpleNamespace 객체는 copy.replace()를 지원해요. 버전 3.3에서 추가되었어요.

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

클래스의 속성 접근을 __getattr__로 라우팅해요. 인스턴스를 통한 접근과 클래스를 통한 접근에서 다르게 동작하는 속성을 정의하는 데 사용하는 디스크립터예요. 인스턴스 접근은 정상적이지만, 클래스를 통한 속성 접근은 클래스의 __getattr__ 메서드로 라우팅돼요(AttributeError를 발생시켜 수행). 이를 통해 인스턴스에서는 프로퍼티를, 클래스에서는 같은 이름의 가상 속성을 가질 수 있어요(enum.Enum 참고). 버전 3.4에서 추가되었어요.

코루틴 유틸리티 함수 (Coroutine Utility Functions)

types.coroutine(gen_func)

제너레이터 함수를, 제너레이터 기반 코루틴을 반환하는 코루틴 함수로 변환해요. 제너레이터 기반 코루틴은 여전히 제너레이터 iterator이지만 코루틴 객체이기도 하고 awaitable이에요. 다만 __await__() 메서드를 구현하지 않을 수도 있어요. gen_func가 제너레이터 함수이면 제자리에서 수정돼요. gen_func가 제너레이터 함수가 아니면 래핑돼요. collections.abc.Generator의 인스턴스를 반환하면 그 인스턴스는 awaitable 프록시 객체로 래핑되고, 다른 모든 타입의 객체는 그대로 반환돼요. 버전 3.5에서 추가되었어요.

더 알아보기 (Learn more)