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

参考

メタクラス

  これらの関数によってサポートされるクラス生成プロセスの完全な詳細

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`

  フレームオブジェクトの型です。トレースバックオブジェクト `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 で追加.