8.9. types — 動的な型生成と組み込み型に対する名前

ソースコード: Lib/types.py


このモジュールは新しい型の動的な生成を支援するユーティリティ関数を定義しています。

さらに、標準の Python インタプリタによって使用されているものの、 intstr のように組み込みとして公開されていないようないくつかのオブジェクト型の名前を定義しています。

最後に、組み込みになるほど基本的でないような追加の型関連のユーティリティと関数をいくつか提供しています。

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__ メソッドを持っていないときは、挿入順序を保存するマッピングが使われます。

参考

Metaclasses
これらの関数によってサポートされるクラス生成プロセスの完全な詳細
PEP 3115 - Metaclasses in Python 3000
__prepare__ 名前空間フックの導入

8.9.2. 標準的なインタプリタ型

このモジュールは、Python インタプリタを実装するために必要な多くの型に対して名前を提供します。それは、listiterator 型のような、単に処理中に付随的に発生するいくつかの型が含まれることを意図的に避けています。

これらの名前は典型的に isinstance()issubclass() によるチェックに使われます。

以下の型に対して標準的な名前が定義されています:

types.FunctionType
types.LambdaType

ユーザ定義の関数と lambda 式によって生成された関数の型です。

types.GeneratorType

ジェネレータ関数によって生成された ジェネレータ イテレータオブジェクトの型です。

types.CoroutineType

async def 関数に生成される コルーチン オブジェクトです。

バージョン 3.5 で追加.

types.AsyncGeneratorType

非同期ジェネレータ関数によって作成された 非同期ジェネレータ イテレータオブジェクトの型です。

バージョン 3.6 で追加.

types.CodeType

compile() 関数が返すようなコードオブジェクトの型です。

types.MethodType

ユーザー定義のクラスのインスタンスのメソッドの型です。

types.BuiltinFunctionType
types.BuiltinMethodType

len()sys.exit() のような組み込み関数や、組み込み型のメソッドの型です。 (ここでは 「組み込み」 という単語を 「Cで書かれた」 という意味で使っています)

class types.ModuleType(name, doc=None)

module の型です。コンストラクタは生成するモジュールの名前と任意でその docstring を受け取ります。

注釈

インポートによりコントロールされる様々な属性を設定する場合、importlib.util.module_from_spec() を使用して新しいモジュールを作成してください。

__doc__

モジュールの docstring です。デフォルトは None です。

__loader__

モジュールをロードする loader です。デフォルトは None です。

バージョン 3.4 で変更: デフォルトが None になりました。以前はオプションでした。

__name__

モジュールの名前です。

__package__

モジュールがどの package に属しているかです。モジュールがトップレベルである (すなわち、いかなる特定のパッケージの一部でもない) 場合、この属性は '' に設定されます。そうでない場合、パッケージ名 (モジュールがパッケージ自身なら __name__) に設定されます。デフォルトは None です。

バージョン 3.4 で変更: デフォルトが None になりました。以前はオプションでした。

types.TracebackType

sys.exc_info()[2] で得られるようなトレースバックオブジェクトの型です。

types.FrameType

フレームオブジェクトの型です。トレースバックオブジェクト tbtb.tb_frame などです。

types.GetSetDescriptorType

FrameType.f_localsarray.array.typecode のような、拡張モジュールにおいて PyGetSetDef によって定義されたオブジェクトの型です。この型はオブジェクト属性のディスクリプタとして利用されます。 property 型と同じ目的を持った型ですが、こちらは拡張モジュールで定義された型のためのものです。

types.MemberDescriptorType

datetime.timedelta.days のような、拡張モジュールにおいて PyMemberDef によって定義されたオブジェクトの型です。この型は、標準の変換関数を利用するような、Cのシンプルなデータメンバで利用されます。 property 型と同じ目的を持った型ですが、こちらは拡張モジュールで定義された型のためのものです。

CPython 実装の詳細: 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__

SimpleNamespaceclass 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 で追加.