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