8.9. types --- 動的な型生成と組み込み型に対する名前¶
ソースコード: Lib/types.py
このモジュールは新しい型の動的な生成を支援するユーティリティ関数を定義しています。
さらに、標準の Python インタプリタによって使用されているものの、 int や str のように組み込みとして公開されていないようないくつかのオブジェクト型の名前を定義しています。
最後に、組み込みになるほど基本的でないような追加の型関連のユーティリティと関数をいくつか提供しています。
8.9.1. 動的な型生成¶
-
types.new_class(name, bases=(), kwds=None, exec_body=None)¶ 適切なメタクラスを使用して動的にクラスオブジェクトを生成します。
最初の3つの引数はクラス定義ヘッダーを構成する—クラス名、基底クラス (順番に)、キーワード引数 (例えば
metaclass)—です。exec_body 引数は、新規に生成されたクラスの名前空間を構築するために使用されるコールバックです。それは唯一の引数としてクラスの名前空間を受け取り、クラスの内容で名前空間を直接更新します。コールバックが渡されない場合、それは
lambda ns: nsを渡すことと同じ効果があります。バージョン 3.3 で追加.
-
types.prepare_class(name, bases=(), kwds=None)¶ 適切なメタクラスを計算してクラスの名前空間を生成します。
引数はクラス定義ヘッダーを構成する要素—クラス名、基底クラス (順番に)、キーワード引数 (例えば
metaclass)—です。返り値は
metaclass, namespace, kwdsの3要素のタプルですmetaclass は適切なメタクラスです。namespace は用意されたクラスの名前空間です。また kwds は、
'metaclass'エントリが削除された、渡された kwds 引数の更新されたコピーです。kwds 引数が渡されなければ、これは空の dict になります。バージョン 3.3 で追加.
バージョン 3.6 で変更: 返されるタプルの
namespace要素のデフォルト値が変更されました。 現在では、メタクラスが__prepare__メソッドを持っていないときは、挿入順序を保存するマッピングが使われます。
8.9.2. 標準的なインタプリタ型¶
このモジュールは、Python インタプリタを実装するために必要な多くの型に対して名前を提供します。それは、listiterator 型のような、単に処理中に付随的に発生するいくつかの型が含まれることを意図的に避けています。
これらの名前は典型的に isinstance() や issubclass() によるチェックに使われます。
以下の型に対して標準的な名前が定義されています:
-
types.MethodType¶ ユーザー定義のクラスのインスタンスのメソッドの型です。
-
types.BuiltinFunctionType¶ -
types.BuiltinMethodType¶ len()やsys.exit()のような組み込み関数や、組み込み型のメソッドの型です。 (ここでは "組み込み" という単語を "Cで書かれた" という意味で使っています)
-
class
types.ModuleType(name, doc=None)¶ module の型です。コンストラクタは生成するモジュールの名前と任意でその docstring を受け取ります。
注釈
インポートによりコントロールされる様々な属性を設定する場合、
importlib.util.module_from_spec()を使用して新しいモジュールを作成してください。-
__name__¶ モジュールの名前です。
-
-
types.TracebackType¶ sys.exc_info()[2]で得られるようなトレースバックオブジェクトの型です。
-
types.FrameType¶ フレームオブジェクトの型です。トレースバックオブジェクト
tbのtb.tb_frameなどです。
-
types.GetSetDescriptorType¶ FrameType.f_localsやarray.array.typecodeのような、拡張モジュールにおいてPyGetSetDefによって定義されたオブジェクトの型です。この型はオブジェクト属性のディスクリプタとして利用されます。property型と同じ目的を持った型ですが、こちらは拡張モジュールで定義された型のためのものです。
-
types.MemberDescriptorType¶ datetime.timedelta.daysのような、拡張モジュールにおいてPyMemberDefによって定義されたオブジェクトの型です。この型は、標準の変換関数を利用するような、Cのシンプルなデータメンバで利用されます。property型と同じ目的を持った型ですが、こちらは拡張モジュールで定義された型のためのものです。CPython implementation detail: Pythonの他の実装では、この型は
GetSetDescriptorTypeと同じかもしれません。
-
class
types.MappingProxyType(mapping)¶ 読み出し専用のマッピングのプロキシです。マッピングのエントリーに関する動的なビューを提供します。つまり、マッピングが変わった場合にビューがこれらの変更を反映するということです。
バージョン 3.3 で追加.
-
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 に対する新しいビューを返します。
-
8.9.3. 追加のユーティリティクラスと関数¶
-
class
types.SimpleNamespace¶ 名前空間への属性アクセスに加えて意味のある repr を提供するための、単純な
objectサブクラスです。objectとは異なり、SimpleNamespaceは、属性を追加したり削除したりすることができます。SimpleNamespaceオブジェクトがキーワード引数で初期化される場合、それらは元になる名前空間に直接追加されます。この型は以下のコードとほぼ等価です:
class SimpleNamespace: def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): return self.__dict__ == other.__dict__
SimpleNamespaceはclass NS: passを置き換えるものとして有用かもしれません。ですが、構造化されたレコード型に対しては、これよりはむしろnamedtuple()を使用してください。バージョン 3.3 で追加.
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶ クラスの属性アクセスを __getattr__ に振り替えます。
これは記述子で、インスタンス経由のアクセスとクラス経由のアクセスで振る舞いが異なる属性を定義するのに使います。インスタンスアクセスは通常通りですが、クラス経由の属性アクセスはクラスの __getattr__ メソッドに振り替えられます。これは AttributeError の送出により行われます。
これによって、インスタンス上で有効なプロパティを持ち、クラス上で同名の仮想属性を持つことができます (例については
Enumを参照してください)。バージョン 3.4 で追加.
8.9.4. コルーチンユーティリティ関数¶
-
types.coroutine(gen_func)¶ この関数は、 generator 関数を、ジェネレータベースのコルーチンを返す coroutine function に変換します。返されるジェネレータベースのコルーチンは依然として generator iterator ですが、同時に coroutine オブジェクトかつ awaitable であるとみなされます。ただし、必ずしも
__await__()メソッドを実装する必要はありません。gen_func はジェネレータ関数で、インプレースに変更されます。
gen_func がジェネレータ関数でない場合、この関数はラップされます。この関数が
collections.abc.Generatorのインスタンスを返す場合、このインスタンスは awaitable なプロキシオブジェクトにラップされます。それ以外のすべての型のオブジェクトは、そのまま返されます。バージョン 3.5 で追加.
