型オブジェクト
**************

type PyTypeObject
    * 次に属します: Stable ABI (不透明な構造体として).*

   組み込み型を記述する際に用いられる、オブジェクトを表す C 構造体です
   。

PyTypeObject PyType_Type
    * 次に属します: Stable ABI.*

   型オブジェクト自身の型オブジェクトです。Python レイヤにおける
   "type" と同じオブジェクトです。

int PyType_Check(PyObject *o)

   オブジェクト *o* が型オブジェクトであれば、標準の型オブジェクトから
   派生した型のインスタンスも含めてゼロ以外を返します。 それ以外の場合
   は 0 を返します。 この関数は常に成功します。

int PyType_CheckExact(PyObject *o)

   オブジェクト *o* が標準の型オブジェクトのインスタンスであり、そのサ
   ブタイプのインスタンスではない場合にゼロ以外を返します。 それ以外の
   場合は 0 を返します。 この関数は常に成功します。

unsigned int PyType_ClearCache()
    * 次に属します: Stable ABI.*

   内部の検索キャッシュをクリアします。現在のバージョンタグを返します
   。

unsigned long PyType_GetFlags(PyTypeObject *type)
    * 次に属します: Stable ABI.*

   *type* の "tp_flags" メンバーを返します。 この関数は主に
   "Py_LIMITED_API" で使うことを想定しています。 個々のフラグビットは
   Python のリリース間で安定していることが保証されますが、"tp_flags"
   自体へのアクセスは Limited API の一部ではありません。

   Added in version 3.2.

   バージョン 3.4 で変更: 返り値の型が "long" ではなく "unsigned long"
   になりました。

PyObject *PyType_GetDict(PyTypeObject *type)

   型オブジェクトの内部の名前空間を返します。 通常は読み取り専用のプロ
   キシ ("cls.__dict__") を通じてのみ公開されるものです。 "tp_dict" に
   直接アクセスする代わりに使えます。 返された辞書は読み取り専用として
   扱わなければなりません。

   この関数は、辞書への直接アクセスが必要で、プロキシや
   "PyObject_GetAttr()" などによる間接アクセスでは不十分な、特定の埋め
   込みや言語バインディングの用途を想定しています。

   拡張モジュールで独自の型を設定するときは、引き続き直接または間接的
   に "tp_dict" を使ってください。

   Added in version 3.12.

void PyType_Modified(PyTypeObject *type)
    * 次に属します: Stable ABI.*

   内部の検索キャッシュを、その type とすべてのサブタイプに対して無効
   にします。この関数は type の属性や基底クラス列を変更したあとに手動
   で呼び出さなければなりません。

int PyType_AddWatcher(PyType_WatchCallback callback)

   *callback* を型ウォッチャーとして登録します。 ゼロ以上の整数 ID を
   返します。 以後 "PyType_Watch()" を呼び出すときには、この ID を渡す
   必要があります。 エラー時 (例えば利用可能なウォッチャー ID が残って
   いない場合) は、例外を設定して "-1" を返します。

   フリースレッドビルドでは "PyType_AddWatcher()" はスレッドセーフでは
   ないため、起動時 (最初のスレッドを作成する前) に呼び出さなければな
   りません。

   Added in version 3.12.

int PyType_ClearWatcher(int watcher_id)

   *watcher_id* ("PyType_AddWatcher()" が以前返した値) で指定したウォ
   ッチャーを解除します。 成功すると "0"、エラー時 (例えば
   *watcher_id* が一度も登録されていない場合) は "-1" を返します。

   拡張モジュールは、以前 "PyType_AddWatcher()" の呼び出しで受け取った
   ものでない *watcher_id* を渡して "PyType_ClearWatcher" を呼び出して
   はいけません。

   Added in version 3.12.

int PyType_Watch(int watcher_id, PyObject *type)

   *type* を監視対象にします。 "PyType_Modified()" が *type* の変更を
   報告するたびに、"PyType_AddWatcher()" から *watcher_id* を割り当て
   られたコールバックが呼び出されます。 ただし、*type* に対する一連の
   変更の間に "_PyType_Lookup()" が呼び出されなければ、コールバックは
   1 度だけ呼び出されることがあります。 これは実装詳細であり、変更され
   る可能性があります。

   監視対象のヒープ型が解放されるときにも、コールバックが呼び出されま
   す。

   拡張モジュールは、以前 "PyType_AddWatcher()" の呼び出しで受け取った
   ものでない *watcher_id* を渡して "PyType_Watch" を呼び出してはいけ
   ません。

   Added in version 3.12.

   バージョン 3.15 で変更: 監視対象のヒープ型が解放されるときにも、コ
   ールバックが呼び出されるようになりました。

int PyType_Unwatch(int watcher_id, PyObject *type)

   *type* を監視対象から外します。 以前の "PyType_Watch()" の呼び出し
   を取り消します。 *type* は "NULL" であってはいけません。

   拡張モジュールは、以前 "PyType_AddWatcher()" の呼び出しで受け取った
   ものでない *watcher_id* を渡して、この関数を呼び出してはいけません
   。

   成功すると "0" を返します。 失敗すると例外を設定して "-1" を返しま
   す。

   Added in version 3.12.

typedef int (*PyType_WatchCallback)(PyObject *type)

   型ウォッチャーのコールバック関数の型。

   コールバックは *type* を変更したり、*type* またはその MRO 内の型に
   対して "PyType_Modified()" が呼び出されるようにしたりしてはいけませ
   ん。 この規則に違反すると、無限再帰を引き起こす可能性があります。

   コールバックは型の解放中に呼び出されることがあります。 その場合、型
   オブジェクトは一時的に復活しており (参照カウントは 1 以上)、すべて
   の属性がまだ有効です。 ただし、型への新しい強参照をコールバックで保
   存してはいけません。 オブジェクトを復活させ、解放を妨げてしまうため
   です。

   Added in version 3.12.

   バージョン 3.15 で変更: 監視対象のヒープ型の解放中にも、コールバッ
   クが呼び出される可能性があるようになりました。

int PyType_HasFeature(PyTypeObject *o, int feature)

   型オブジェクト *o* に機能 *feature* が設定されていれば、ゼロ以外を
   返します。 型の機能は、それぞれ 1 ビットのフラグで表します。

int PyType_FastSubclass(PyTypeObject *type, int flag)

   型オブジェクト *type* にサブクラスフラグ *flag* が設定されていれば
   、ゼロ以外を返します。 サブクラスフラグは "Py_TPFLAGS_*_SUBCLASS"
   で表します。 この関数は、一般的な型の多くの "_Check" 関数で使われて
   います。

   参考:

     "PyObject_TypeCheck()" は、サブクラスフラグのない型の "_Check" 関
     数で、より低速な代替として使われます。

int PyType_IS_GC(PyTypeObject *o)

   型オブジェクトが循環参照の検出をサポートしている場合に真を返します
   。 型のフラグ "Py_TPFLAGS_HAVE_GC" を調べます。

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
    * 次に属します: Stable ABI.*

   *a* が *b* のサブタイプの場合に真を返します。

   この関数が調べるのは実際のサブタイプ関係だけで、*b* の
   "__subclasscheck__()" は呼び出しません。 "issubclass()" と同じ検査
   を行うには "PyObject_IsSubclass()" を呼び出してください。

PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   型オブジェクトの "tp_alloc" スロット用の汎用ハンドラです。 Python
   のデフォルトのメモリ割り当て機構を使って新しいインスタンスのメモリ
   を割り当て、ゼロで埋めてから、"PyObject_Init()" または
   "PyObject_InitVar()" を呼び出すのと同じように初期化します。

   オブジェクトのメモリを割り当てるためにこれを直接呼び出してはいけま
   せん。 代わりに型の "tp_alloc" スロットを呼び出してください。

   ガベージコレクションをサポートする型 ("Py_TPFLAGS_HAVE_GC" フラグが
   設定されているもの) では、"PyObject_GC_New" または
   "PyObject_GC_NewVar" と同様に動作し、"tp_free" に設定した
   "PyObject_GC_Del()" と組み合わせて使う必要があります。 それ以外の型
   では、"PyObject_New" または "PyObject_NewVar" と同様に動作し、
   "tp_free" に設定した "PyObject_Free()" と組み合わせて使う必要があり
   ます。 いずれの場合も、初期化前にメモリがゼロで埋められることが保証
   される点が異なります。

PyObject *PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   型オブジェクトの "tp_new" スロット用の汎用ハンドラです。 型の
   "tp_alloc" スロットを使って新しいインスタンスを作成し、作成したオブ
   ジェクトを返します。

int PyType_Ready(PyTypeObject *type)
    * 次に属します: Stable ABI.*

   型オブジェクトの初期化を完了します。 すべての型オブジェクトについて
   、初期化を仕上げるために呼び出す必要があります。 この関数は、型の基
   底クラスから継承するスロットを追加します。 成功すると "0" を返し、
   エラー時は例外を設定して "-1" を返します。

   注釈:

     基底クラスのいずれかが GC プロトコルを実装しており、指定した型の
     フラグに "Py_TPFLAGS_HAVE_GC" が含まれていなければ、GC プロトコル
     の実装が基底クラスから自動的に継承されます。 一方、作成する型のフ
     ラグに "Py_TPFLAGS_HAVE_GC" が含まれている場合は、少なくとも
     "tp_traverse" ハンドラを実装して、自分で GC プロトコルを実装 **し
     なければなりません**。

PyObject *PyType_GetName(PyTypeObject *type)
    *戻り値: 新しい参照。** 次に属します: Stable ABI (バージョン 3.11
   より).*

   型の名前を返します。 型の "__name__" 属性の取得と同等です。

   Added in version 3.11.

PyObject *PyType_GetQualName(PyTypeObject *type)
    *戻り値: 新しい参照。** 次に属します: Stable ABI (バージョン 3.11
   より).*

   型の修飾名を返します。 型の "__qualname__" 属性の取得と同等です。

   Added in version 3.11.

PyObject *PyType_GetFullyQualifiedName(PyTypeObject *type)
    * 次に属します: Stable ABI (バージョン 3.13 より).*

   型の完全修飾名を返します。
   "f"{type.__module__}.{type.__qualname__}"" と同等ですが、
   "type.__module__" が文字列でないか ""builtins"" の場合は
   "type.__qualname__" と同等です。

   Added in version 3.13.

PyObject *PyType_GetModuleName(PyTypeObject *type)
    * 次に属します: Stable ABI (バージョン 3.13 より).*

   型のモジュール名を返します。 "type.__module__" 属性の取得と同等です
   。

   Added in version 3.13.

void *PyType_GetSlot(PyTypeObject *type, int slot)
    * 次に属します: Stable ABI (バージョン 3.4 より).*

   与えられたスロットに格納されている関数ポインタを返します。返り値が
   "NULL" の場合は、スロットが "NULL" か、関数が不正な引数で呼ばれたこ
   とを示します。通常、呼び出し側は返り値のポインタを適切な関数型にキ
   ャストします。

   *slot* 引数に指定できる値は "PyType_Slot.slot" を参照してください。

   Added in version 3.4.

   バージョン 3.10 で変更: "PyType_GetSlot()" がすべての型を受け付ける
   ようになりました。 以前は ヒープ型 に限られていました。

PyObject *PyType_GetModule(PyTypeObject *type)
    *戻り値: 借用参照。** 次に属します: Stable ABI (バージョン 3.10 よ
   り).*

   "PyType_FromModuleAndSpec()" で型を作成したときに、その型に関連付け
   たモジュールオブジェクトを返します。

   返される参照は *type* からの *借用参照* で、*type* への参照を保持し
   ている間は有効です。 "Py_DECREF()" などで解放しないでください。

   指定された型にモジュールが関連付けられていない場合は、"TypeError"
   を設定して "NULL" を返します。

   この関数は通常、メソッドの定義元のモジュールを取得するために使いま
   す。 そのようなメソッド内で "PyType_GetModule(Py_TYPE(self))" を呼
   び出しても、意図した結果にならない場合がある点に注意してください。
   "Py_TYPE(self)" は意図したクラスの *サブクラス* である可能性があり
   、サブクラスは基底クラスと同じモジュールで定義されているとは限りま
   せん。 メソッドを定義しているクラスを取得する方法は "PyCMethod" を
   参照してください。 "PyCMethod" を使えない場合は
   "PyType_GetModuleByToken()" を参照してください。

   Added in version 3.9.

void *PyType_GetModuleState(PyTypeObject *type)
    * 次に属します: Stable ABI (バージョン 3.10 より).*

   指定された型に関連付けられたモジュールオブジェクトの状態を返します
   。 "PyType_GetModule()" の結果に対して "PyModule_GetState()" を呼び
   出す処理の短縮形です。

   指定された型にモジュールが関連付けられていない場合は、"TypeError"
   を設定して "NULL" を返します。

   *type* にモジュールが関連付けられていても、その状態が "NULL" の場合
   は、例外を設定せずに "NULL" を返します。

   Added in version 3.9.

PyObject *PyType_GetModuleByToken(PyTypeObject *type, const void *mod_token)
    *戻り値: 新しい参照。** 次に属します: Stable ABI (バージョン 3.15
   より).*

   モジュールが指定された モジュールトークン を持つ最初の基底クラスを
   探し、そのモジュールを返します。

   モジュールが見つからない場合は、"TypeError" を送出して "NULL" を返
   します。

   この関数は、"tp_init" や "nb_add" などのスロットメソッドや、
   "PyCMethod" 呼び出し規約でメソッドの定義元クラスを渡せない場所で、
   "PyModule_GetState()" と組み合わせてモジュール状態を取得するために
   使うことを想定しています。

   Added in version 3.15.

PyObject *PyType_GetModuleByDef(PyTypeObject *type, struct PyModuleDef *def)
    *戻り値: 借用参照。** 次に属します: Stable ABI (バージョン 3.13 よ
   り).*

   モジュールが指定された "PyModuleDef" *def* から作成されたか、モジュ
   ールトークン が *def* と等しい最初の基底クラスを探し、そのモジュー
   ルを返します。

   "PyModuleDef" から作成されたモジュールでは、トークンは常にその
   "PyModuleDef" のアドレスに設定されます。 つまり、この関数は次の点を
   除いて "PyType_GetModuleByToken()" と同等です。

   * 借用参照を返します。

   * 引数の型が "void*" ではありません (C では表面的な違いです)。

   返される参照は *type* からの *借用参照* で、*type* への参照を保持し
   ている間は有効です。 "Py_DECREF()" などで解放しないでください。

   Added in version 3.11.

int PyType_GetBaseByToken(PyTypeObject *type, void *tp_token, PyTypeObject **result)
    * 次に属します: Stable ABI (バージョン 3.14 より).*

   *type* の *メソッド解決順序* の中で、"Py_tp_token" トークンが
   *tp_token* と等しい最初の基底クラスを探します。

   * 見つかった場合は、**result* にその型への新しい *強参照* を設定し
     て "1" を返します。

   * 見つからない場合は、**result* に "NULL" を設定して "0" を返します
     。

   * エラー時は **result* に "NULL" を設定し、例外を設定して "-1" を返
     します。

   *result* 引数は "NULL" にできます。 その場合、**result* は設定され
   ません。 戻り値だけが必要な場合に使ってください。

   *tp_token* 引数は "NULL" にできません。

   Added in version 3.14.

int PyUnstable_Type_AssignVersionTag(PyTypeObject *type)

   *これは Unstable APIです。マイナーリリースで予告なく変更されること
   があります。*

   指定された型へのバージョンタグの割り当てを試みます。

   型がすでに有効なバージョンタグを持っていたか、新しいタグを割り当て
   られた場合は 1 を返します。 新しいタグを割り当てられなかった場合は
   0 を返します。

   Added in version 3.12.

int PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)

   *type* のインスタンスが弱参照の作成をサポートする場合は真、それ以外
   の場合は偽を返します。 この関数は常に成功します。 *type* は "NULL"
   であってはいけません。

   参考:

     * 弱参照オブジェクト

     * "weakref"


ヒープに割り当てられる型の作成
==============================

次の関数で ヒープ型 を作成します。

PyObject *PyType_FromSlots(const PySlot *slots)
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   "PySlot" 配列から ヒープ型 を作成して返します。 スロット全般につい
   ては 定義用スロット、型の作成に固有のスロットについては 型のスロッ
   ト ID を参照してください。

   この関数は新しい型に対して "PyType_Ready()" を呼び出します。

   この関数の動作は、"type()" の呼び出しや "class" 文の使用と完全には
   一致 **しない** 点に注意してください。 利用者が指定した基底型やメタ
   クラスを使う場合は、"PyType_From*" 関数よりも "type" (またはメタク
   ラス) を 呼び出す 方法を推奨します。 具体的には、次の違いがあります
   。

   * "__new__()" is not called on the new class (and it must be set to
     "type.__new__").

   * 新しいクラスの "__init__()" は呼び出されません。

   * どの基底クラスの "__init_subclass__()" も呼び出されません。

   * 新しいデスクリプタの "__set_name__()" は呼び出されません。

   スロットは通常、グローバルな static const 配列として定義します。 た
   だし、スロットの値をコンパイル時に静的に決められない場合もあります
   。 例えば "Py_tp_bases"、"Py_tp_metaclass"、"Py_tp_module" などのス
   ロットには、生存する Python オブジェクトが必要です。 この場合は、そ
   うしたスロットをスタック上に置き、"Py_slot_subslots" で静的なスロッ
   ト配列を参照することを推奨します。 例えば次のようにします。

      static const PySlot my_slots[] = {
         PySlot_STATIC_DATA(Py_tp_name, "MyClass"),
         PySlot_FUNC(Py_tp_repr, my_repr_func),
         ...
         PySlot_END
      };

      PyObject *make_my_class(PyObject *module) {
         PySlot all_slots[] = {
            PySlot_STATIC_DATA(Py_slot_subslots, my_slots),
            PySlot_DATA(Py_tp_module, module),
            PySlot_END
         };
         return PyType_FromSlots(all_slots);
      }

"Py_TPFLAGS_IMMUTABLETYPE" フラグを付けずに作成したヒープ型は、Python
コードで定義したクラスと同様に、属性の設定などによって変更できます。
型を完全に初期化するために、そうした変更が必要な場合もありますが、初期
化が終わった後は利用者による変更を禁止したいかもしれません。

int PyType_Freeze(PyTypeObject *type)
    * 次に属します: Stable ABI (バージョン 3.14 より).*

   "Py_TPFLAGS_IMMUTABLETYPE" フラグを設定して、型を変更不能にします。

   *type* のすべての基底クラスが変更不能でなければなりません。

   成功すると "0" を返します。 エラー時は例外を設定して "-1" を返しま
   す。

   変更不能にする前に型を使ってはいけません。 例えば、変更不能にする前
   にその型のインスタンスを作成してはいけません。

   Added in version 3.14.


型のスロット ID
---------------

型のスロット ID の大半は、"PyTypeObject"、"PyNumberMethods"、
"PySequenceMethods"、"PyMappingMethods"、"PyAsyncMethods" 構造体のフィ
ールド名に "Py_" 接頭辞を付けた名前です。 例えば、次のように使います。

* "PyTypeObject.tp_dealloc" の設定には "Py_tp_dealloc"

* "PyNumberMethods.nb_add" の設定には "Py_nb_add"

* "PySequenceMethods.sq_length" の設定には "Py_sq_length"

次のものをスロットとして指定するときには、追加の注意事項があります。

* "Py_tp_name"

* "Py_tp_basicsize" と "Py_tp_extra_basicsize"

* "Py_tp_itemsize"

* "Py_tp_flags"

次の追加スロットは、"PyTypeObject" 構造体のフィールドに直接対応するも
のではありません。

* "Py_tp_token"

* "Py_tp_metaclass"

* "Py_tp_module"

次の「オフセット」フィールドは "PyType_Slot" では設定できません。

* "tp_weaklistoffset" (可能なら代わりに "Py_TPFLAGS_MANAGED_WEAKREF"
  を使ってください)

* "tp_dictoffset" (可能なら代わりに "Py_TPFLAGS_MANAGED_DICT" を使って
  ください)

* "tp_vectorcall_offset" (PyMemberDef で ""__vectorcalloffset__"" を使
  ってください)

"MANAGED" フラグに切り替えられない場合 (例えば vectorcall を使う場合や
Python 3.12 より前をサポートする場合) は、"Py_tp_members" でオフセット
を指定してください。 詳細は PyMemberDef のドキュメント を参照してくだ
さい。

次の内部フィールドは、ヒープ型の作成時には一切設定できません。

* "tp_dict", "tp_mro", "tp_cache", "tp_subclasses", and "tp_weaklist".

"Py_tp_base" スロットは "Py_tp_bases" と同等で、どちらにも型または型の
タプルを設定できます。 両方を指定した場合は "Py_tp_bases" の値が使われ
ます。

次のものを除き、スロットの値を "NULL" にはできません。

* "Py_tp_doc"

* "Py_tp_token" (明確にするため、"NULL" より "Py_TP_USE_SPEC" を使うこ
  とを推奨します)

バージョン 3.9 で変更: "PyBufferProcs" のスロットは、制限のない API で
は設定できます。

バージョン 3.11 で変更: "bf_getbuffer" と "bf_releasebuffer" が
Limited API でも利用できるようになりました。

バージョン 3.14 で変更: "Py_tp_vectorcall" で "tp_vectorcall" フィール
ドを設定できるようになりました。 詳細はフィールドの説明を参照してくだ
さい。

バージョン 3.15 で変更: "Py_tp_bases" スロットに単一の型オブジェクトを
設定して、"Py_tp_base" スロットと同じように使えるようになりました。 以
前は型のタプルが必要でした。

次のスロットは基になる型の構造体のフィールドに対応しますが、スロットと
して使う際には追加の注意事項があります。

Py_tp_name
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   型の名前を指定する "スロット ID" で、"PyTypeObject.tp_name" の設定
   に使います。

   型を作成するには、このスロット (または "PyType_Spec.name") が必要で
   す。

   "PyType_Spec.slots" では使えません。 代わりに "PyType_Spec.name" を
   使ってください。

   CPython はスロットを順番に処理します。 後のスロットの処理に失敗した
   ときにエラーメッセージに名前を含められるように、"Py_tp_name" をスロ
   ット配列の先頭に置くことを推奨します。

   Added in version 3.15.

Py_tp_basicsize
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   インスタンスのサイズをバイト単位で指定する "スロット ID" です。
   "PyTypeObject.tp_basicsize" の設定に使います。

   値は正でなければなりません。

   "PyType_Spec.slots" では使えません。 代わりに
   "PyType_Spec.basicsize" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。 必要であれば代わ
   りに "PyTypeObject.tp_basicsize" を使ってください。 ただし、型のサ
   イズは実装詳細とみなされることが多い点に注意してください。

   Added in version 3.15.

Py_tp_extra_basicsize
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   型のデータサイズをバイト単位で指定する "スロット ID" です。 基底ク
   ラスに必要な領域に *加えて*、このクラスのインスタンスに必要な領域の
   大きさを指定します。

   この値は、基底クラスのサイズと合わせて "PyTypeObject.tp_basicsize"
   の設定に使われます。 Python は "tp_basicsize" のアラインメント要件
   を満たすように、必要に応じてパディングを挿入します。

   この方法で確保したサブクラス固有のメモリへのポインタは、
   "PyObject_GetTypeData()" で取得してください。

   値は正でなければなりません。 インスタンスに追加のサイズが不要である
   (サイズを継承する) 場合は、"Py_tp_extra_basicsize" スロットをゼロに
   設定するのではなく、省略してください。

   "Py_tp_basicsize" と "Py_tp_extra_basicsize" の両方を指定するとエラ
   ーになります。

   "PyType_Spec.slots" では使えません。 代わりに負の
   "PyType_Spec.basicsize" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。

   Added in version 3.15.

Py_tp_itemsize
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   可変サイズの型の 1 要素のサイズをバイト単位で指定する "スロット ID"
   です。 "PyTypeObject.tp_itemsize" の設定に使います。 注意事項は
   "tp_itemsize" の説明を参照してください。

   値は正でなければなりません。

   このスロットがない場合は "tp_itemsize" を継承します。 任意の可変サ
   イズのクラスを拡張するのは危険です。 可変サイズのメモリに固定のオフ
   セットを使う型があり、サブクラスの固定サイズのメモリと重なる可能性
   があるためです。 誤りを防ぐため、"itemsize" を継承できるのは次の場
   合だけです。

   * 基底クラスが可変サイズではない ("tp_itemsize" がゼロである) 場合
     。

   * 要求された "PyType_Spec.basicsize" が正で、基底クラスのメモリレイ
     アウトを把握していると考えられる場合。

   * 要求された "PyType_Spec.basicsize" がゼロで、サブクラスがインスタ
     ンスのメモリに直接アクセスしないと考えられる場合。

   * "Py_TPFLAGS_ITEMS_AT_END" フラグがある場合。

   "PyType_Spec.slots" では使えません。 代わりに
   "PyType_Spec.itemsize" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。

   Added in version 3.15.

Py_tp_flags
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   型のフラグを指定する "スロット ID" で、"PyTypeObject.tp_flags" の設
   定に使います。

   "Py_TPFLAGS_HEAPTYPE" フラグは設定しません。
   "PyType_FromSpecWithBases()" が自動的に設定します。

   "PyType_Spec.slots" では使えません。 代わりに負の
   "PyType_Spec.basicsize" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。 代わりに
   "PyType_GetFlags()" を使ってください。

   Added in version 3.15.

Py_tp_bases
    * 次に属します: Stable ABI.*

   "Slot ID" for type flags, used to set "PyTypeObject.tp_bases".

   新しい型が継承する型オブジェクトのタプルを設定できます。 Python の
   クラス定義 の「位置引数」に相当します。

   また、単一の型オブジェクトを設定して基底クラスを 1 つ指定することも
   できます。 要素が 1 つのタプルを指定した場合と同じ効果があります。

   バージョン 3.15 で変更: 以前の "Py_tp_bases" には型のタプルが必要で
   した。

Py_tp_base
    * 次に属します: Stable ABI.*

   "Py_tp_bases" (末尾に "s" がある方) と同等です。 両方を指定した場合
   は "Py_tp_bases" が優先され、このスロットは無視されます。

   バージョン 3.15 で変更: 以前の "Py_tp_base" にはタプルではなく単一
   の型が必要でした。

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 古い Python バー
   ジョンを対象としない場合は、"Py_tp_bases" を使うことを推奨します。

次のスロットは、基になる構造体の公開フィールドには対応しません。

Py_tp_metaclass
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   作成される型オブジェクトの構築に使うメタクラスを指定する "スロット
   ID" です。 省略すると、基底クラス ("Py_tp_bases" または
   "PyType_FromMetaclass()" の *bases* 引数) からメタクラスが決まりま
   す。

   "tp_new" をオーバーライドするメタクラスは、"tp_new" が "NULL" の場
   合を除いてサポートされません。

   "PyType_Spec.slots" では使えません。 "PyType_Spec" でメタクラスを指
   定するには "PyType_FromMetaclass()" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。 代わりに型オブジ
   ェクトに対して "Py_TYPE()" を使ってください。

   Added in version 3.15.

Py_tp_module
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   新しいクラスの定義元モジュールを記録する "スロット ID" です。

   値はモジュールオブジェクトでなければなりません。 モジュールは新しい
   型に関連付けられ、後で "PyType_GetModule()" を使って取得できます。
   関連付けられたモジュールはサブクラスに継承されないため、クラスごと
   に指定する必要があります。

   "PyType_Spec.slots" では使えません。 "PyType_Spec" でモジュールを指
   定するには "PyType_FromMetaclass()" を使ってください。

   このスロットは "PyType_GetSlot()" では使えません。 代わりに
   "PyType_GetModule()" を使ってください。

   Added in version 3.15.

Py_tp_token
    * 次に属します: Stable ABI (バージョン 3.14 より).*

   クラスの静的なメモリレイアウト ID を記録する "スロット ID" です。

   クラスを "PyType_Spec" で定義し、その spec が静的に割り当てられてい
   る場合、特殊な値 "Py_TP_USE_SPEC" を使って spec をトークンとして設
   定できます。

      static PyType_Slot foo_slots[] = {
         {Py_tp_token, Py_TP_USE_SPEC},

   任意のポインタを設定することもできますが、次の条件を満たす必要があ
   ります。

   * クラスが存在する間にポインタが他の用途に再利用されないよう、その
     参照先がクラスより長く存続すること。

   * 他の拡張モジュールと競合しないよう、クラスが属する拡張モジュール
     にそのポインタが「属する」こと。

   クラスの基底クラスが指定したトークンを持つかどうか、つまりメモリレ
   イアウトに互換性があるかどうかを調べるには
   "PyType_GetBaseByToken()" を使ってください。

   基底クラスを考慮せず、指定したクラスのトークンを取得するには、
   "Py_tp_token" を指定して "PyType_GetSlot()" を使ってください。

   Added in version 3.14.

   Py_TP_USE_SPEC
       * 次に属します: Stable ABI (バージョン 3.14 より).*

      "Py_tp_token" の値として使い、クラスの "PyType_Spec" をトークン
      に設定します。 "PyType_Spec" で定義されたクラスでのみ使えます。

      "NULL" に展開されます。

      Added in version 3.14.

Py_tp_slots
    * 次に属します: Stable ABI (バージョン 3.15 より).*

   "Py_slot_subslots" と同じように動作する "スロット ID" ですが、
   "PyType_Slot" 構造体の配列を指定します。

   Added in version 3.15.


緩やかに非推奨となった API
==========================

次の関数は *緩やかに非推奨* となっています。 引き続き動作しますが、新
機能は新しい "PyType_From*" 関数の引数としてではなく、
"PyType_FromSlots()" のスロットとして追加されます。

PyObject *PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module, PyType_Spec *spec, PyObject *bases)
    * 次に属します: Stable ABI (バージョン 3.12 より).*

   *spec* から ヒープ型 を作成して返します ("Py_TPFLAGS_HEAPTYPE" を参
   照)。

   "NULL" でない *metaclass* 引数は "Py_tp_metaclass" スロットに対応し
   ます。

   A non-"NULL" *bases* argument corresponds to the "Py_tp_bases"
   slot, and takes precedence over "Py_tp_bases" and "Py_tp_bases"
   slots.

   "NULL" でない *module* 引数は "Py_tp_module" スロットに対応します。

   この関数は新しい型に対して "PyType_Ready()" を呼び出します。

   この関数の動作は、"type()" の呼び出しや "class" 文の使用と完全には
   一致 **しない** 点に注意してください。 詳細は "PyType_FromSlots()"
   の説明の注記を参照してください。

   Added in version 3.12.

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
   "PyType_FromSlots()" を使うことを推奨します。

PyObject *PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
    *戻り値: 新しい参照。** 次に属します: Stable ABI (バージョン 3.10
   より).*

   "PyType_FromMetaclass(NULL, module, spec, bases)" と同等です。

   Added in version 3.9.

   バージョン 3.10 で変更: *bases* 引数に単一のクラスを、"tp_doc" スロ
   ットに "NULL" を指定できるようになりました。

   バージョン 3.12 で変更: 指定された基底クラスに対応するメタクラスを
   探して使うようになりました。 以前は "type" のインスタンスだけを返し
   ていました。メタクラスの "tp_new" は *無視* されるため、初期化が不
   完全になる可能性があります。 メタクラスが "tp_new" をオーバーライド
   しているクラスの作成は非推奨です。

   バージョン 3.14 で変更: メタクラスが "tp_new" をオーバーライドして
   いるクラスは、作成できなくなりました。

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
   "PyType_FromSlots()" を使うことを推奨します。

PyObject *PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
    *戻り値: 新しい参照。** 次に属します: Stable ABI (バージョン 3.3
   より).*

   "PyType_FromMetaclass(NULL, NULL, spec, bases)" と同等です。

   Added in version 3.3.

   バージョン 3.12 で変更: 指定された基底クラスに対応するメタクラスを
   探して使うようになりました。 以前は "type" のインスタンスだけを返し
   ていました。メタクラスの "tp_new" は *無視* されるため、初期化が不
   完全になる可能性があります。 メタクラスが "tp_new" をオーバーライド
   しているクラスの作成は非推奨です。

   バージョン 3.14 で変更: メタクラスが "tp_new" をオーバーライドして
   いるクラスは、作成できなくなりました。

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
   "PyType_FromSlots()" を使うことを推奨します。

PyObject *PyType_FromSpec(PyType_Spec *spec)
    *戻り値: 新しい参照。** 次に属します: Stable ABI.*

   "PyType_FromMetaclass(NULL, NULL, spec, NULL)" と同等です。

   バージョン 3.12 で変更: *Py_tp_base[s]* スロットに指定された基底ク
   ラスに対応するメタクラスを探して使うようになりました。 以前は
   "type" のインスタンスだけを返していました。メタクラスの "tp_new" は
   *無視* されるため、初期化が不完全になる可能性があります。 メタクラ
   スが "tp_new" をオーバーライドしているクラスの作成は非推奨です。

   バージョン 3.14 で変更: メタクラスが "tp_new" をオーバーライドして
   いるクラスは、作成できなくなりました。

   バージョン 3.15 で ソフト非推奨 <Soft deprecated>: 新しいコードでは
   "PyType_FromSlots()" を使うことを推奨します。

type PyType_Spec
    * 次に属します: Stable ABI (すべてのメンバーを含む).*

   型の動作を定義する構造体で、"PyType_FromMetaclass()" などの緩やかに
   非推奨となった関数で使います。

   この構造体には、"PyType_FromSlots()" の スロット としても指定できる
   メンバーがいくつかあり、それらに加えて、より単純な構造体のスロット
   エントリーの配列を含みます。

   const char *name

      "Py_tp_name" に対応します。

   int basicsize

      正の場合、"Py_tp_basicsize" に対応します。

      負の場合、絶対値を設定した "Py_tp_extra_basicsize" に対応します
      。

      バージョン 3.12 で変更: 以前はこのフィールドを負にできませんでし
      た。

   int itemsize

      "Py_tp_itemsize" に対応します。

   unsigned int flags

      "Py_tp_flags" に対応します。

   PyType_Slot *slots

      "PyType_Slot" 構造体の配列です ("PySlot" ではありません)。

      特殊なスロット値 "{0, NULL}" で終端します。 各スロット ID は最大
      1 回だけ指定する必要があります。

      type PyType_Slot
          * 次に属します: Stable ABI (すべてのメンバーを含む).*

         型の任意の機能を定義する構造体で、"PyType_FromMetaclass()" な
         どの緩やかに非推奨となった関数で使います。

         "Py_tp_slots" を使うと "PyType_Slot" 配列を "PySlot" 配列に含
         められ、逆方向には "Py_slot_subslots" を使えます。

         各 "PyType_Slot" 構造体 "tpslot" は、次の "PySlot" 構造体とし
         て解釈されます。

            (PySlot){
               .sl_id=tpslot.slot,
               .sl_flags=PySlot_INTPTR | sub_static,
               .sl_ptr=tpslot.func
            }

         ここで "sub_static" は、スロットがそのフラグを必要とする場合
         (例えば "Py_tp_methods") または「親」の "Py_tp_slots" スロッ
         ト (存在する場合) にこのフラグがある場合に、"PySlot_STATIC"
         になります。

         int slot

            "PySlot.sl_id" に対応します。

         void *pfunc

            "PySlot.sl_ptr" に対応します。
