型オブジェクト

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 であってはいけません。

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

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

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 構造体のフィールドに直接対応するものではありません。

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

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

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

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

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

バージョン 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 に対応します。