types --- 動的な型生成と組み込み型の名前¶
ソースコード: Lib/types.py
このモジュールは新しい型の動的な生成を支援するユーティリティ関数を定義します。
さらに、標準の Python インタプリタによって使用されているものの、 int や str のように組み込みとして公開されていないようないくつかのオブジェクト型の名前を定義しています。
さらに、組み込みにするほど基本的ではない、型に関連する補助的なユーティリティクラスや関数も提供します。
動的な型生成¶
- types.new_class(name, bases=(), kwds=None, exec_body=None)¶
適切なメタクラスを使用して動的にクラスオブジェクトを生成します。
最初の3つの引数はクラス定義ヘッダーを構成する—クラス名、基底クラス (順番に)、キーワード引数 (例えば
metaclass)—です。exec_body 引数は、新規に生成されたクラスの名前空間を構築するために使用されるコールバックです。それは唯一の引数としてクラスの名前空間を受け取り、クラスの内容で名前空間を直接更新します。コールバックが渡されない場合、それは
lambda ns: Noneを渡すことと同じ効果があります。Added in version 3.3.
- types.prepare_class(name, bases=(), kwds=None)¶
適切なメタクラスを計算してクラスの名前空間を生成します。
引数はクラス定義ヘッダーを構成する要素—クラス名、基底クラス (順番に)、キーワード引数 (例えば
metaclass)—です。返り値は
metaclass, namespace, kwdsの3要素のタプルですmetaclass は適切なメタクラスです。namespace は用意されたクラスの名前空間です。また kwds は、
'metaclass'エントリが削除された、渡された kwds 引数の更新されたコピーです。kwds 引数が渡されなければ、これは空の dict になります。Added in version 3.3.
バージョン 3.6 で変更: 返されるタプルの
namespace要素のデフォルト値が変更されました。 現在では、メタクラスが__prepare__メソッドを持っていないときは、挿入順序を保存するマッピングが使われます。
参考
- types.resolve_bases(bases)¶
PEP 560 の規定に従って MRO の項目を動的に解決します。
この関数は bases から
typeのインスタンスでない項目を探します。 そのようなオブジェクトが__mro_entries__()メソッドを持つ場合は、このメソッドの呼び出し結果を展開して置き換えたタプルを返します。 bases の項目がtypeのインスタンスであるか、__mro_entries__()メソッドを持たない場合は、変更せずに戻り値のタプルに含めます。Added in version 3.7.
- types.get_original_bases(cls, /)¶
PEP 560 の仕組みに従って各基底の
__mro_entries__()メソッドが呼び出される前に、cls の基底として最初に指定されたオブジェクトのタプルを返します。 ジェネリック のイントロスペクションに役立ちます。クラスが
__orig_bases__属性を持つ場合は、cls.__orig_bases__の値を返します。__orig_bases__属性を持たない場合は、cls.__bases__を返します。例:
from typing import TypeVar, Generic, NamedTuple, TypedDict T = TypeVar("T") class Foo(Generic[T]): ... class Bar(Foo[int], float): ... class Baz(list[str]): ... Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) Spam = TypedDict("Spam", {"a": int, "b": str}) assert Bar.__bases__ == (Foo, float) assert get_original_bases(Bar) == (Foo[int], float) assert Baz.__bases__ == (list,) assert get_original_bases(Baz) == (list[str],) assert Eggs.__bases__ == (tuple,) assert get_original_bases(Eggs) == (NamedTuple,) assert Spam.__bases__ == (dict,) assert get_original_bases(Spam) == (TypedDict,) assert int.__bases__ == (object,) assert get_original_bases(int) == (object,)
Added in version 3.12.
参考
PEP 560 - typing モジュールとジェネリック型に対する言語コアによるサポート
標準的なインタプリタ型¶
このモジュールは、Python インタプリタを実装するために必要な多くの型に対して名前を提供します。それは、listiterator 型のような、単に処理中に付随的に発生するいくつかの型が含まれることを意図的に避けています。
これらの名前は典型的に isinstance() や issubclass() によるチェックに使われます。
これらのタイプのいずれかをインスタンス化する場合、シグネチャは Python のバージョンによって異なる可能性があることに注意してください。
以下の型に対して標準的な名前が定義されています:
- class types.FunctionType¶
- class types.LambdaType¶
ユーザ定義の関数と
lambda式によって生成された関数の型です。引数
codeを指定して 監査イベントfunction.__new__を送出します。この監査イベントは、関数オブジェクトを直接インスタンス化した場合にのみ発生し、通常のコンパイル時には発生しません。
- class types.AsyncGeneratorType¶
非同期ジェネレータ関数によって作成された 非同期ジェネレータ イテレータオブジェクトの型です。
Added in version 3.6.
- class types.CodeType(**kwargs)¶
compile()が返すものなど、コードオブジェクト の型です。引数
code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flagsを指定して 監査イベントcode.__new__を送出します。監査の対象となる引数の名前や位置は、初期化子が要求するものと一致しない場合があります。 この監査イベントはコードオブジェクトを直接インスタンス化したときにのみ発生し、通常のコンパイル時には発生しません。
- class types.MethodType¶
ユーザー定義のクラスのインスタンスのメソッドの型です。
- class types.BuiltinFunctionType¶
- class types.BuiltinMethodType¶
len()やsys.exit()のような組み込み関数や、組み込み型のメソッドの型です。 (ここでは "組み込み" という単語を "Cで書かれた" という意味で使っています)
- class types.WrapperDescriptorType¶
object.__init__()やobject.__lt__()など、一部の組み込みデータ型や基底クラスのメソッドの型です。Added in version 3.7.
- class types.MethodWrapperType¶
一部の組み込みデータ型や基底クラスの 束縛された メソッドの型です。 例えば
object().__str__の型がこれに当たります。Added in version 3.7.
- class types.NotImplementedType¶
NotImplementedの型です。Added in version 3.10.
- class types.MethodDescriptorType¶
str.join()など、一部の組み込みデータ型のメソッドの型です。Added in version 3.7.
- class types.ClassMethodDescriptorType¶
dict.__dict__['fromkeys']など、一部の組み込みデータ型の 束縛されていない クラスメソッドの型です。Added in version 3.7.
- class types.ModuleType(name, doc=None)¶
module の型です。コンストラクタは生成するモジュールの名前と任意でその docstring を受け取ります。
参考
- モジュールオブジェクトのドキュメント
ModuleTypeのインスタンスが持つ特殊属性について詳しく説明しています。importlib.util.module_from_spec()ModuleTypeコンストラクタで作成したモジュールでは、多くの特殊属性が未設定かデフォルト値のままです。module_from_spec()を使うと、各種属性が適切に設定される、より確実な方法でModuleTypeのインスタンスを作成できます。
- class types.GenericAlias(t_origin, t_args)¶
list[int]など、パラメータ化されたジェネリック の型です。t_originはlist、tuple、dictなどのパラメータ化されていないジェネリッククラスである必要があります。t_argsはt_originをパラメータ化する型のtupleです (長さが 1 でも構いません)。>>> from types import GenericAlias >>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
Added in version 3.9.
バージョン 3.9.2 で変更: この型のサブクラスを作成できるようになりました。
参考
- ジェネリックエイリアス型
types.GenericAliasのインスタンスについて詳しく説明したドキュメント- PEP 585 - 標準コレクション型の型ヒントにおける総称型 (generics) の使用
types.GenericAliasクラスの導入
- class types.UnionType¶
ユニオン型の式 の型です。
Added in version 3.10.
バージョン 3.14 で変更:
typing.Unionのエイリアスになりました。
- class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶
sys.exception().__traceback__に含まれるようなトレースバックオブジェクトの型です。利用できる属性と操作の詳細、およびトレースバックを動的に作成する方法は、言語リファレンス を参照してください。
- class types.FrameType¶
tbがトレースバックオブジェクトである場合のtb.tb_frameなど、フレームオブジェクト の型です。
- class types.FrameLocalsProxyType¶
frame.f_locals属性にあるような、フレームのローカル変数のプロキシオブジェクトの型です。Added in version 3.15.
参考
- class types.LazyImportType¶
遅延インポートのプロキシオブジェクトの型です。 これらのオブジェクトはモジュールが遅延インポートされたときに作成され、実際にモジュールにアクセスするまでプレースホルダーとして機能します。 この型を使うと、プログラムで遅延インポートを検出できます。
Added in version 3.15.
参考
- resolve()¶
遅延インポートを実行し、インポートされる「実際の」オブジェクトを返します。
- class types.GetSetDescriptorType¶
FrameType.f_localsやarray.array.typecodeなど、拡張モジュールでPyGetSetDefを使って定義されたオブジェクトの型です。 この型はオブジェクトの属性のデスクリプタとして使われます。property型と同じ目的を持ちますが、拡張モジュールで定義されたクラス用です。
- class types.MemberDescriptorType¶
datetime.timedelta.daysなど、拡張モジュールでPyMemberDefを使って定義されたオブジェクトの型です。 この型は、標準の変換関数を利用する単純な C データメンバーのデスクリプタとして使われます。property型と同じ目的を持ちますが、拡張モジュールで定義されたクラス用です。また、クラスが
__slots__属性を使って定義されている場合は、各スロットに対してMemberDescriptorTypeのインスタンスがクラス属性として追加されます。 これにより、スロットがクラスの__dict__に現れるようになります。Pythonの他の実装では、この型は
GetSetDescriptorTypeと同じかもしれません。
- class types.MappingProxyType(mapping)¶
読み出し専用のマッピングのプロキシです。マッピングのエントリーに関する動的なビューを提供します。つまり、マッピングが変わった場合にビューがこれらの変更を反映するということです。
MappingProxyTypeは 2 つの型を引数とする ジェネリック です。 型引数は順に、元になったマッピングのキーと値の型を表します。Added in version 3.3.
バージョン 3.9 で変更: PEP 584 の新しい和集合演算子 (
|) に対応しました。 演算はそのまま元になったマッピングに委譲します。- key in proxy
元になったマッピングが key というキーを持っている場合
Trueを返します。そうでなければFalseを返します。
- proxy[key]
元になったマッピングの key というキーに対応するアイテムを返します。 key が存在しなければ、
KeyErrorが発生します。
- iter(proxy)
元になったマッピングのキーを列挙するイテレータを返します。これは
iter(proxy.keys())のショートカットです。
- len(proxy)
元になったマッピングに含まれるアイテムの数を返します。
- copy()¶
元になったマッピングの浅いコピーを返します。
- get(key[, default])¶
key が元になったマッピングに含まれている場合 key に対する値を返し、そうでなければ default を返します。もし default が与えられない場合は、デフォルト値の
Noneになります。そのため、このメソッドがKeyErrorを発生させることはありません。
- items()¶
元になったマッピングの items (
(key, value)ペアの列) に対する新しいビューを返します。
- keys()¶
元になったマッピングの keys に対する新しいビューを返します。
- values()¶
元になったマッピングの values に対する新しいビューを返します。
- reversed(proxy)
元になったマッピングのキーを逆順にたどるイテレータを返します。
Added in version 3.9.
- hash(proxy)
元になったマッピングのハッシュ値を返します。
Added in version 3.12.
- class types.CapsuleType¶
カプセルオブジェクト の型です。
Added in version 3.13.
追加のユーティリティクラスと関数¶
- class types.SimpleNamespace¶
名前空間への属性アクセスに加えて意味のある repr を提供するための、単純な
objectサブクラスです。objectとは異なり、SimpleNamespaceでは属性を追加したり削除したりできます。SimpleNamespaceオブジェクトはdictと同じように、キーワード引数、単一の位置引数、またはその両方で初期化できます。 キーワード引数で初期化する場合は、それらが内部の名前空間に直接追加されます。 位置引数で初期化する場合は、その引数から得られるキーと値のペアで内部の名前空間を更新します。 位置引数には、マッピングオブジェクトか、キーと値のペアを生成する イテラブル オブジェクトを指定できます。 これらのキーはすべて文字列でなければなりません。この型は以下のコードとほぼ等価です:
class SimpleNamespace: def __init__(self, mapping_or_iterable=(), /, **kwargs): self.__dict__.update(mapping_or_iterable) self.__dict__.update(kwargs) def __repr__(self): items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): return self.__dict__ == other.__dict__ return NotImplemented
SimpleNamespaceはclass NS: passを置き換えるものとして有用かもしれません。ですが、構造化されたレコード型に対しては、これよりはむしろnamedtuple()を使用してください。copy.replace()はSimpleNamespaceオブジェクトに対応しています。Added in version 3.3.
バージョン 3.9 で変更: repr での属性の順序が、アルファベット順から (
dictと同じ) 挿入順に変わりました。バージョン 3.13 で変更: 省略可能な位置引数に対応しました。
- types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
クラスの属性アクセスを __getattr__ に振り替えます。
これは記述子で、インスタンス経由のアクセスとクラス経由のアクセスで振る舞いが異なる属性を定義するのに使います。インスタンスアクセスは通常通りですが、クラス経由の属性アクセスはクラスの __getattr__ メソッドに振り替えられます。これは AttributeError の送出により行われます。
これによって、インスタンス上で有効なプロパティを持ち、クラス上で同名の仮想属性を持つことができます (例については
enum.Enumを参照してください)。Added in version 3.4.
コルーチンユーティリティ関数¶
- types.coroutine(gen_func)¶
この関数は ジェネレータ 関数を、ジェネレータベースのコルーチンを返す コルーチン関数 に変換します。 ジェネレータベースのコルーチンは依然として ジェネレータイテレータ ですが、コルーチン オブジェクトかつ awaitable ともみなされます。 ただし、必ずしも
__await__()メソッドを実装しているとは限りません。gen_func がジェネレータ関数の場合、その関数をインプレースに変更します。
gen_func がジェネレータ関数でない場合、この関数はラップされます。この関数が
collections.abc.Generatorのインスタンスを返す場合、このインスタンスは awaitable なプロキシオブジェクトにラップされます。それ以外のすべての型のオブジェクトは、そのまま返されます。Added in version 3.5.