タイプオブジェクト—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.7/c-api/typeobj
移動先:案内検索

タイプオブジェクト

おそらく、Pythonオブジェクトシステムの最も重要な構造の1つは、新しい型を定義する構造、 PyTypeObject 構造です。 型オブジェクトは、PyObject_*()またはPyType_*()関数のいずれかを使用して処理できますが、ほとんどのPythonアプリケーションにとって興味深いものはあまりありません。 これらのオブジェクトは、オブジェクトの動作の基本であるため、インタープリター自体および新しいタイプを実装する拡張モジュールにとって非常に重要です。

型オブジェクトは、ほとんどの標準型と比較してかなり大きいです。 サイズの理由は、各型オブジェクトが多数の値、主にC関数ポインターを格納し、それぞれが型の機能のごく一部を実装するためです。 このセクションでは、タイプオブジェクトのフィールドについて詳しく説明します。 フィールドは、構造内で発生する順序で説明されます。

Typedef:unaryfunc、binaryfunc、ternaryfunc、inquiry、intargfunc、intintargfunc、intobjargproc、intintobjargproc、objobjargproc、destructor、freefunc、printfunc、getattrfunc、getattrofunc、setattrfunc、setattrofunc、reprfunc、hashfunc

PyTypeObject の構造定義は、Include/object.hにあります。 参照の便宜のために、これはそこで見つかった定義を繰り返します。

typedef struct _typeobject {
    PyObject_VAR_HEAD
    const char *tp_name; /* For printing, in format "<module>.<name>" */
    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */

    /* Methods to implement standard operations */

    destructor tp_dealloc;
    printfunc tp_print;
    getattrfunc tp_getattr;
    setattrfunc tp_setattr;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    struct PyMethodDef *tp_methods;
    struct PyMemberDef *tp_members;
    struct PyGetSetDef *tp_getset;
    struct _typeobject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache;
    PyObject *tp_subclasses;
    PyObject *tp_weaklist;
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6 */
    unsigned int tp_version_tag;

    destructor tp_finalize;

} PyTypeObject;

タイプオブジェクト構造は、 PyVarObject 構造を拡張します。 ob_sizeフィールドは、動的型に使用されます(type_new()によって作成され、通常はクラスステートメントから呼び出されます)。 PyType_Type (メタタイプ)は tp_itemsize を初期化することに注意してください。これは、そのインスタンス(つまり、 タイプオブジェクト) must にはob_sizeフィールドが必要です。

PyObject *PyObject._ob_next

PyObject *PyObject._ob_prev

これらのフィールドは、マクロPy_TRACE_REFSが定義されている場合にのみ存在します。 NULLへの初期化は、PyObject_HEAD_INITマクロによって処理されます。 静的に割り当てられたオブジェクトの場合、これらのフィールドは常にNULLのままです。 動的に割り当てられたオブジェクトの場合、これら2つのフィールドは、ヒープ上のすべてのライブオブジェクトの二重リンクリストにオブジェクトをリンクするために使用されます。 これは、さまざまなデバッグ目的に使用できます。 現在のところ、唯一の用途は、環境変数 PYTHONDUMPREFS が設定されている場合に、実行の終了時にまだ生きているオブジェクトを印刷することです。

これらのフィールドはサブタイプに継承されません。

Py_ssize_t PyObject.ob_refcnt

これは、PyObject_HEAD_INITマクロによって1に初期化されたタイプオブジェクトの参照カウントです。 静的に割り当てられた型オブジェクトの場合、型のインスタンス(ob_typeが型を指すオブジェクト)はではなくは参照としてカウントされることに注意してください。 ただし、動的に割り当てられた型オブジェクトの場合、インスタンス do は参照としてカウントされます。

このフィールドはサブタイプに継承されません。

PyTypeObject *PyObject.ob_type

これはタイプのタイプ、つまりメタタイプです。 PyObject_HEAD_INITマクロへの引数によって初期化され、その値は通常&PyType_Typeである必要があります。 ただし、(少なくとも)Windowsで使用可能でなければならない動的にロード可能な拡張モジュールの場合、コンパイラーは、これが有効なイニシャライザーではないと文句を言います。 したがって、慣例では、NULLPyObject_HEAD_INITマクロに渡し、モジュールの初期化関数の開始時に、他の処理を行う前にこのフィールドを明示的に初期化します。 これは通常、次のように行われます。

Foo_Type.ob_type = &PyType_Type;

これは、タイプのインスタンスを作成する前に実行する必要があります。 PyType_Ready()は、ob_typeNULLであるかどうかを確認し、そうである場合は、基本クラスのob_typeフィールドに初期化します。 PyType_Ready()は、このフィールドがゼロ以外の場合、このフィールドを変更しません。

このフィールドはサブタイプに継承されます。

Py_ssize_t PyVarObject.ob_size

静的に割り当てられた型オブジェクトの場合、これはゼロに初期化する必要があります。 動的に割り当てられたタイプオブジェクトの場合、このフィールドには特別な内部的な意味があります。

このフィールドはサブタイプに継承されません。

const char *PyTypeObject.tp_name

タイプの名前を含むNULで終了する文字列へのポインタ。 モジュールグローバルとしてアクセス可能な型の場合、文字列は完全なモジュール名、ドット、型名の順にする必要があります。 組み込み型の場合は、型名だけにする必要があります。 モジュールがパッケージのサブモジュールである場合、完全なパッケージ名は完全なモジュール名の一部です。 たとえば、パッケージPのサブパッケージQのモジュールMで定義されたTという名前の型には、 tp_name イニシャライザー"P.Q.M.T"

動的に割り当てられた型オブジェクトの場合、これは型名であり、型dictにキー'__module__'の値として明示的に格納されているモジュール名である必要があります。

静的に割り当てられたタイプのオブジェクトの場合、tp_nameフィールドにはドットが含まれている必要があります。 最後のドットの前のすべてが__module__属性としてアクセス可能になり、最後のドットの後のすべてが __ name __ 属性としてアクセス可能になります。

ドットが存在しない場合、 tp_name フィールド全体が __ name __ 属性としてアクセス可能になり、__module__属性は未定義です(辞書で明示的に設定されていない限り、上で説明した)。 これはあなたのタイプが酸洗いすることが不可能になることを意味します。 また、pydocで作成されたモジュールのドキュメントには記載されていません。

このフィールドはサブタイプに継承されません。

Py_ssize_t PyTypeObject.tp_basicsize

Py_ssize_t PyTypeObject.tp_itemsize

これらのフィールドを使用すると、タイプのインスタンスのサイズをバイト単位で計算できます。

タイプには2種類あります。固定長のインスタンスを持つタイプにはゼロ tp_itemsize フィールドがあり、可変長のインスタンスを持つタイプにはゼロ以外の tp_itemsize フィールドがあります。 固定長のインスタンスを持つタイプの場合、 tp_basicsize で指定されているように、すべてのインスタンスのサイズは同じです。

可変長インスタンスを持つタイプの場合、インスタンスにはob_sizeフィールドが必要であり、インスタンスサイズは tp_basicsizetp_itemsize のN倍を加えたものです。ここで、Nは「オブジェクトの長さ」。 Nの値は通常、インスタンスのob_sizeフィールドに格納されます。 例外があります。たとえば、intは負のob_sizeを使用して負の数を示し、Nはabs(ob_size)です。 また、インスタンスレイアウトにob_sizeフィールドが存在するからといって、インスタンス構造が可変長であることを意味するわけではありません(たとえば、リストタイプの構造には固定長のインスタンスがありますが、これらのインスタンスには意味のあるob_sizeフィールド)。

基本サイズには、マクロ PyObject_HEAD または PyObject_VAR_HEAD (インスタンス構造体の宣言に使用される方)によって宣言されたインスタンスのフィールドが含まれ、これには_ob_prevが含まれます。および_ob_nextフィールド(存在する場合)。 つまり、 tp_basicsize の初期化子を取得する唯一の正しい方法は、インスタンスレイアウトの宣言に使用される構造体でsizeof演算子を使用することです。 基本サイズにはGCヘッダーサイズは含まれていません。

これらのフィールドは、サブタイプによって個別に継承されます。 基本タイプにゼロ以外の tp_itemsize がある場合、サブタイプで tp_itemsize を別のゼロ以外の値に設定することは一般的に安全ではありません(ただし、これは基本タイプ)。

配置に関する注意:変数アイテムに特定の配置が必要な場合は、 tp_basicsize の値で処理する必要があります。 例:型がdoubleの配列を実装するとします。 tp_itemsizesizeof(double)です。 tp_basicsizesizeof(double)の倍数であるのはプログラマーの責任です(これがdoubleの配置要件であると想定)。

destructor PyTypeObject.tp_dealloc

インスタンスデストラクタ関数へのポインタ。 この関数は、インスタンスが割り当て解除されないことが型によって保証されていない限り、定義する必要があります(シングルトンNoneおよびEllipsisの場合のように)。

デストラクタ関数は、新しい参照カウントがゼロのときに Py_DECREF()および Py_XDECREF()マクロによって呼び出されます。 この時点で、インスタンスはまだ存在していますが、それへの参照はありません。 デストラクタ関数は、インスタンスが所有するすべての参照を解放し、インスタンスが所有するすべてのメモリバッファを解放し(バッファの割り当てに使用される割り当て関数に対応する解放関数を使用)、最後に(最後のアクションとして)型の[X270X ] tp_free 関数。 タイプがサブタイプ化できない場合( Py_TPFLAGS_BASETYPE フラグビットが設定されていない場合)、 tp_free を介さずに、オブジェクトのデアロケーターを直接呼び出すことができます。 オブジェクトのデロケーターは、インスタンスの割り当てに使用されるものである必要があります。 これは通常、 PyObject_New()またはPyObject_VarNew()を使用してインスタンスが割り当てられた場合は PyObject_Del()、インスタンスが割り当てられた場合は PyObject_GC_Del()です。 PyObject_GC_New()または PyObject_GC_NewVar()を使用します。

このフィールドはサブタイプに継承されます。

printfunc PyTypeObject.tp_print
予約済みスロット。以前はPython2.xの印刷フォーマットに使用されていました。
getattrfunc PyTypeObject.tp_getattr

get-attribute-string関数へのオプションのポインター。

このフィールドは非推奨です。 定義するときは、 tp_getattro 関数と同じように機能する関数を指す必要がありますが、属性名を指定するためにPython文字列オブジェクトの代わりにC文字列を使用します。 署名は

PyObject * tp_getattr(PyObject *o, char *attr_name);

このフィールドは、 tp_getattro とともにサブタイプに継承されます。サブタイプの tp_getattr および tp_getattro は両方ともNULLです。

setattrfunc PyTypeObject.tp_setattr

属性を設定および削除するための関数へのオプションのポインタ。

このフィールドは非推奨です。 定義するときは、 tp_setattro 関数と同じように機能する関数を指す必要がありますが、属性名を指定するためにPython文字列オブジェクトの代わりにC文字列を使用します。 署名は

PyObject * tp_setattr(PyObject *o, char *attr_name, PyObject *v);

v 引数をNULLに設定して、属性を削除します。 このフィールドは、 tp_setattro とともにサブタイプに継承されます。サブタイプの tp_setattr および tp_setattro は両方ともNULLです。

PyAsyncMethods *tp_as_async

Cレベルで awaitable および asynchronous iterator プロトコルを実装するオブジェクトにのみ関連するフィールドを含む追加の構造体へのポインター。 詳細については、非同期オブジェクト構造を参照してください。

バージョン3.5の新機能:以前はtp_compareおよびtp_reservedと呼ばれていました。

reprfunc PyTypeObject.tp_repr

組み込み関数 repr()を実装する関数へのオプションのポインター。

署名は PyObject_Repr()の場合と同じです。 文字列またはUnicodeオブジェクトを返す必要があります。 理想的には、この関数は、 eval()に渡されたときに、適切な環境が与えられたときに同じ値のオブジェクトを返す文字列を返す必要があります。 これが不可能な場合は、'<'で始まり、'>'で終わる文字列を返す必要があります。この文字列から、オブジェクトのタイプと値の両方を推測できます。

このフィールドが設定されていない場合、<%s object at %p>の形式の文字列が返されます。ここで、%sは型名に置き換えられ、%pはオブジェクトのメモリアドレスに置き換えられます。

このフィールドはサブタイプに継承されます。

PyNumberMethods *tp_as_number

番号プロトコルを実装するオブジェクトにのみ関連するフィールドを含む追加の構造体へのポインター。 これらのフィールドは、 Number Object Structures に記載されています。

tp_as_numberフィールドは継承されませんが、含まれているフィールドは個別に継承されます。

PySequenceMethods *tp_as_sequence

シーケンスプロトコルを実装するオブジェクトにのみ関連するフィールドを含む追加の構造体へのポインタ。 これらのフィールドは、シーケンスオブジェクト構造に記載されています。

tp_as_sequenceフィールドは継承されませんが、含まれているフィールドは個別に継承されます。

PyMappingMethods *tp_as_mapping

マッピングプロトコルを実装するオブジェクトにのみ関連するフィールドを含む追加の構造体へのポインタ。 これらのフィールドは、マッピングオブジェクト構造に記載されています。

tp_as_mappingフィールドは継承されませんが、含まれているフィールドは個別に継承されます。

hashfunc PyTypeObject.tp_hash

組み込み関数 hash()を実装する関数へのオプションのポインター。

署名は PyObject_Hash()の場合と同じです。 タイプPy_hash_tの値を返す必要があります。 値-1は通常の戻り値として返されるべきではありません。 ハッシュ値の計算中にエラーが発生した場合、関数は例外を設定して-1を返す必要があります。

このフィールドを明示的に PyObject_HashNotImplemented()に設定して、親タイプからのハッシュメソッドの継承をブロックできます。 これは、Pythonレベルで__hash__ = Noneと同等であると解釈され、isinstance(o, collections.Hashable)Falseを正しく返します。 逆もまた真であることに注意してください。Pythonレベルのクラスで__hash__ = Noneを設定すると、tp_hashスロットが PyObject_HashNotImplemented()に設定されます。

このフィールドが設定されていない場合、オブジェクトのハッシュを取得しようとすると、 TypeError が発生します。

このフィールドは、 tp_richcompare とともにサブタイプに継承されます。サブタイプの tp_richcompareの場合、サブタイプは tp_richcomparetp_hash の両方を継承します。 ] tp_hash は両方ともNULLです。

ternaryfunc PyTypeObject.tp_call

オブジェクトの呼び出しを実装する関数へのオプションのポインター。 オブジェクトが呼び出せない場合、これはNULLである必要があります。 署名は PyObject_Call()の場合と同じです。

このフィールドはサブタイプに継承されます。

reprfunc PyTypeObject.tp_str

組み込み操作 str()を実装する関数へのオプションのポインター。 ( str は現在型であり、 str()はその型のコンストラクターを呼び出すことに注意してください。 このコンストラクターは PyObject_Str()を呼び出して実際の作業を行い、 PyObject_Str()はこのハンドラーを呼び出します。)

署名は PyObject_Str()の場合と同じです。 文字列またはUnicodeオブジェクトを返す必要があります。 この関数は、オブジェクトの「わかりやすい」文字列表現を返す必要があります。これは、特に print()関数によって使用される表現であるためです。

このフィールドが設定されていない場合、 PyObject_Repr()が呼び出され、文字列表現が返されます。

このフィールドはサブタイプに継承されます。

getattrofunc PyTypeObject.tp_getattro

get-attribute関数へのオプションのポインター。

署名は PyObject_GetAttr()の場合と同じです。 通常、このフィールドを PyObject_GenericGetAttr()に設定すると便利です。これは、オブジェクト属性を検索する通常の方法を実装します。

このフィールドは、 tp_getattr とともにサブタイプに継承されます。サブタイプの tp_getattr および tp_getattro は両方ともNULLです。

setattrofunc PyTypeObject.tp_setattro

属性を設定および削除するための関数へのオプションのポインタ。

署名は PyObject_SetAttr()の場合と同じですが、属性を削除するには vNULLに設定する必要があります。 通常、このフィールドを PyObject_GenericSetAttr()に設定すると便利です。これは、オブジェクト属性を設定する通常の方法を実装します。

このフィールドは、 tp_setattr とともにサブタイプに継承されます。サブタイプの tp_setattr および tp_setattro は両方ともNULLです。

PyBufferProcs *PyTypeObject.tp_as_buffer

バッファインターフェイスを実装するオブジェクトにのみ関連するフィールドを含む追加の構造体へのポインタ。 これらのフィールドは、バッファオブジェクト構造に記載されています。

tp_as_buffer フィールドは継承されませんが、含まれているフィールドは個別に継承されます。

unsigned long PyTypeObject.tp_flags

このフィールドは、さまざまなフラグのビットマスクです。 一部のフラグは、特定の状況でのバリアントセマンティクスを示します。 その他は、型オブジェクト(またはtp_as_numbertp_as_sequencetp_as_mapping、および tp_as_buffer を介して参照される拡張構造)の特定のフィールドを示すために使用されます。歴史的に常に存在するとは限らなかったものが有効です。 そのようなフラグビットがクリアされている場合、それが保護するタイプフィールドにアクセスしてはならず、代わりにゼロまたはNULL値を持っていると見なす必要があります。

このフィールドの継承は複雑です。 ほとんどのフラグビットは個別に継承されます。 基本タイプにフラグビットが設定されている場合、サブタイプはこのフラグビットを継承します。 拡張構造が継承される場合、拡張構造に関連するフラグビットは厳密に継承されます。 フラグビットの基本型の値は、拡張構造へのポインタとともにサブタイプにコピーされます。 Py_TPFLAGS_HAVE_GC フラグビットは、 tp_traverse および tp_clear フィールドと一緒に継承されます。 Py_TPFLAGS_HAVE_GC フラグビットがサブタイプでクリアされ、サブタイプの tp_traverse および tp_clear フィールドが存在し、NULL値を持つ場合。

現在、次のビットマスクが定義されています。 これらは、|演算子を使用してOR演算し、 tp_flags フィールドの値を形成できます。 マクロ PyType_HasFeature()は、型とフラグの値 tpf を受け取り、tp->tp_flags & fがゼロ以外かどうかをチェックします。

Py_TPFLAGS_HEAPTYPE

このビットは、型オブジェクト自体がヒープに割り当てられるときに設定されます。 この場合、そのインスタンスのob_typeフィールドは型への参照と見なされ、型オブジェクトは新しいインスタンスが作成されるとINCREFされ、インスタンスが破棄されるとDECREFされます(これにより、サブタイプのインスタンスには適用されません。インスタンスのob_typeによって参照されるタイプのみがINCREFまたはDECREFされます)。

Py_TPFLAGS_BASETYPE

このビットは、そのタイプを別のタイプの基本タイプとして使用できる場合にセットされます。 このビットがクリアされている場合、型をサブタイプ化することはできません(Javaの「final」クラスと同様)。

Py_TPFLAGS_READY

このビットは、タイプオブジェクトが PyType_Ready()によって完全に初期化されたときに設定されます。

Py_TPFLAGS_READYING

このビットは、 PyType_Ready()が型オブジェクトを初期化する過程で設定されます。

Py_TPFLAGS_HAVE_GC

このビットは、オブジェクトがガベージコレクションをサポートしている場合に設定されます。 このビットが設定されている場合、インスタンスは PyObject_GC_New()を使用して作成し、 PyObject_GC_Del()を使用して破棄する必要があります。 詳細については、セクションサイクリックガベージコレクションのサポートを参照してください。 このビットは、GC関連のフィールド tp_traverse および tp_clear が型オブジェクトに存在することも意味します。

Py_TPFLAGS_DEFAULT

これは、型オブジェクトとその拡張構造内の特定のフィールドの存在に関連するすべてのビットのビットマスクです。 現在、次のビットが含まれています:Py_TPFLAGS_HAVE_STACKLESS_EXTENSIONPy_TPFLAGS_HAVE_VERSION_TAG

Py_TPFLAGS_LONG_SUBCLASS
Py_TPFLAGS_LIST_SUBCLASS
Py_TPFLAGS_TUPLE_SUBCLASS
Py_TPFLAGS_BYTES_SUBCLASS
Py_TPFLAGS_UNICODE_SUBCLASS
Py_TPFLAGS_DICT_SUBCLASS
Py_TPFLAGS_BASE_EXC_SUBCLASS
Py_TPFLAGS_TYPE_SUBCLASS

これらのフラグは、 PyLong_Check()などの関数によって使用され、型が組み込み型のサブクラスであるかどうかをすばやく判別します。 このような特定のチェックは、 PyObject_IsInstance()などの一般的なチェックよりも高速です。 組み込みから継承するカスタム型では、 tp_flags を適切に設定する必要があります。そうしないと、そのような型と相互作用するコードは、使用するチェックの種類によって動作が異なります。

Py_TPFLAGS_HAVE_FINALIZE

このビットは、 tp_finalize スロットが型構造体に存在する場合に設定されます。

バージョン3.4の新機能。

const char *PyTypeObject.tp_doc

この型オブジェクトのdocstringを与えるNULで終了するC文字列へのオプションのポインタ。 これは、タイプおよびタイプのインスタンスの__doc__属性として公開されます。

このフィールドは、サブタイプによって継承されたではありません

traverseproc PyTypeObject.tp_traverse

ガベージコレクターのトラバーサル関数へのオプションのポインター。 これは、 Py_TPFLAGS_HAVE_GC フラグビットが設定されている場合にのみ使用されます。 Pythonのガベージコレクションスキームの詳細については、セクション Cyclic GarbageCollectionのサポートを参照してください。

tp_traverse ポインターは、参照サイクルを検出するためにガベージコレクターによって使用されます。 tp_traverse 関数の一般的な実装では、インスタンスが所有するPythonオブジェクトであるインスタンスの各メンバーで Py_VISIT()を呼び出すだけです。 たとえば、これは _thread 拡張モジュールの関数local_traverse()です。

static int
local_traverse(localobject *self, visitproc visit, void *arg)
{
    Py_VISIT(self->args);
    Py_VISIT(self->kw);
    Py_VISIT(self->dict);
    return 0;
}

Py_VISIT()は、参照サイクルに参加できるメンバーでのみ呼び出されることに注意してください。 self->keyメンバーもありますが、NULLまたはPython文字列のみであるため、参照サイクルの一部にすることはできません。

一方、メンバーがサイクルの一部になることは決してないことがわかっている場合でも、デバッグの補助として、 gc モジュールの get_referents()とにかくそのメンバーにアクセスすることをお勧めします。関数にはそれが含まれます。

警告

tp_traverse を実装する場合、インスタンスが所有する(それらへの強い参照を持つ)メンバーのみにアクセスする必要があります。 たとえば、オブジェクトが tp_weaklist スロットを介した弱参照をサポートしている場合、リンクリストをサポートするポインター( tp_weaklist が指すもの)は、ではなくにアクセスする必要があります。インスタンスはそれ自体への弱参照を直接所有していません(弱参照リストは弱参照機構をサポートするためにありますが、インスタンスがまだ生きている場合でも削除できるため、インスタンスにはその中の要素への強参照がありません)。

Py_VISIT()では、local_traverse()visit および arg パラメーターにこれらの特定の名前を付ける必要があることに注意してください。 それらに何も名前を付けないでください。

このフィールドは、 tp_clear および Py_TPFLAGS_HAVE_GC フラグビットとともにサブタイプによって継承されます。フラグビット、 tp_traverse 、および tp_clear はすべて継承されます。サブタイプですべてゼロの場合は、基本タイプから。

inquiry PyTypeObject.tp_clear

ガベージコレクターのclear関数へのオプションのポインター。 これは、 Py_TPFLAGS_HAVE_GC フラグビットが設定されている場合にのみ使用されます。

tp_clear メンバー関数は、ガベージコレクターによって検出された循環ガベージの参照サイクルを中断するために使用されます。 まとめると、システム内のすべての tp_clear 関数を組み合わせて、すべての参照サイクルを中断する必要があります。 これは微妙であり、疑わしい場合は tp_clear 関数を指定してください。 たとえば、タプルタイプは tp_clear 関数を実装していません。これは、参照サイクルを完全にタプルで構成できないことを証明できるためです。 したがって、他のタイプの tp_clear 関数は、タプルを含むサイクルを中断するのに十分でなければなりません。 これはすぐには明らかではなく、 tp_clear の実装を避ける正当な理由はめったにありません。

tp_clear の実装では、次の例のように、Pythonオブジェクトである可能性のあるメンバーの参照へのインスタンスの参照を削除し、それらのメンバーへのポインターをNULLに設定する必要があります。

static int
local_clear(localobject *self)
{
    Py_CLEAR(self->key);
    Py_CLEAR(self->args);
    Py_CLEAR(self->kw);
    Py_CLEAR(self->dict);
    return 0;
}

参照のクリアはデリケートであるため、 Py_CLEAR()マクロを使用する必要があります。含まれるオブジェクトへのポインターがNULLに設定されるまで、含まれるオブジェクトへの参照をデクリメントしないでください。 これは、参照カウントを減らすと、含まれているオブジェクトがゴミ箱になり、任意のPythonコードの呼び出しを含む一連の再生アクティビティがトリガーされる可能性があるためです(含まれているオブジェクトに関連付けられているファイナライザーまたはweakrefコールバックが原因)。 そのようなコードが self を再度参照できる場合は、その時点で含まれているオブジェクトへのポインタがNULLであり、 self が含まれているオブジェクトを認識できるようにすることが重要です。使用できなくなりました。 Py_CLEAR()マクロは、安全な順序で操作を実行します。

tp_clear 関数の目的は参照サイクルを中断することであるため、参照サイクルに参加できないPython文字列やPython整数などの含まれているオブジェクトをクリアする必要はありません。 一方、含まれているすべてのPythonオブジェクトをクリアし、タイプの tp_dealloc 関数を記述して tp_clear を呼び出すと便利な場合があります。

Pythonのガベージコレクションスキームの詳細については、セクション Cyclic GarbageCollectionのサポートを参照してください。

このフィールドは、 tp_traverse および Py_TPFLAGS_HAVE_GC フラグビットとともにサブタイプによって継承されます。フラグビット、 tp_traverse 、および tp_clear はすべて継承されます。サブタイプですべてゼロの場合は、基本タイプから。

richcmpfunc PyTypeObject.tp_richcompare

署名がPyObject *tp_richcompare(PyObject *a, PyObject *b, int op)であるリッチ比較関数へのオプションのポインター。 最初のパラメーターは、 PyTypeObject で定義されている型のインスタンスであることが保証されています。

関数は比較の結果を返す必要があります(通常はPy_TrueまたはPy_False)。 比較が未定義の場合はPy_NotImplementedを返す必要があり、別のエラーが発生した場合はNULLを返し、例外条件を設定する必要があります。

ノート

限られた比較のセットだけが意味をなすタイプを実装したい場合(例: ==!=は、<とその仲間ではなく)、豊富な比較関数で TypeError を直接発生させます。

このフィールドは、 tp_hash とともにサブタイプに継承されます。サブタイプの tp_richcompare および tp_hash [の場合、サブタイプは tp_richcompare および tp_hash を継承します。 X190X]は両方ともNULLです。

次の定数は、 tp_richcompare および PyObject_RichCompare()の3番目の引数として使用されるように定義されています。

絶え間ない

比較

Py_LT

<

Py_LE

<=

Py_EQ

==

Py_NE

!=

Py_GT

>

Py_GE

>=

次のマクロは、豊富な比較関数の記述を容易にするために定義されています。

PyObject *Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, int op)

比較の結果に応じて、関数からPy_TrueまたはPy_Falseを返します。 VAL_AとVAL_Bは、C比較演算子で順序付け可能である必要があります(たとえば、C intまたはfloatの場合があります)。 3番目の引数は、 PyObject_RichCompare()のように、要求された操作を指定します。

戻り値の参照カウントは適切にインクリメントされます。

エラーの場合、例外を設定し、関数からNULLを返します。

バージョン3.7の新機能。

Py_ssize_t PyTypeObject.tp_weaklistoffset

このタイプのインスタンスが弱参照可能である場合、このフィールドはゼロより大きく、弱参照リストヘッドのインスタンス構造にオフセットが含まれます(GCヘッダーが存在する場合は無視されます)。 このオフセットは、PyObject_ClearWeakRefs()およびPyWeakref_*()関数によって使用されます。 インスタンス構造には、NULLに初期化されるタイプPyObject*のフィールドを含める必要があります。

このフィールドを tp_weaklist と混同しないでください。 これは、型オブジェクト自体への弱参照のリストヘッドです。

このフィールドはサブタイプに継承されますが、以下のルールを参照してください。 サブタイプはこのオフセットをオーバーライドできます。 これは、サブタイプが基本タイプとは異なる弱参照リストヘッドを使用することを意味します。 リストヘッドは常に tp_weaklistoffset を介して検出されるため、これは問題にはなりません。

クラスステートメントで定義された型に __ slots __ 宣言がなく、その基本型のいずれも弱参照可能でない場合、インスタンスレイアウトに弱参照リストのヘッドスロットを追加し、そのスロットのオフセットの tp_weaklistoffset

タイプの__slots__宣言に__weakref__という名前のスロットが含まれている場合、そのスロットはタイプのインスタンスの弱参照リストヘッドになり、スロットのオフセットはタイプの tp_weaklistoffset に格納されます。 ]。

型の__slots__宣言に__weakref__という名前のスロットが含まれていない場合、型はその tp_weaklistoffset を基本型から継承します。

getiterfunc PyTypeObject.tp_iter

オブジェクトのイテレータを返す関数へのオプションのポインタ。 その存在は通常、このタイプのインスタンスが反復可能であることを示します(ただし、シーケンスはこの関数なしで反復可能である可能性があります)。

この関数には、 PyObject_GetIter()と同じ署名があります。

このフィールドはサブタイプに継承されます。

iternextfunc PyTypeObject.tp_iternext

イテレータ内の次の項目を返す関数へのオプションのポインタ。 イテレータが使い果たされると、NULLを返す必要があります。 StopIteration 例外が設定される場合と設定されない場合があります。 別のエラーが発生した場合は、NULLも返す必要があります。 その存在は、このタイプのインスタンスがイテレータであることを示します。

イテレータ型は tp_iter 関数も定義する必要があり、その関数は(新しいイテレータインスタンスではなく)イテレータインスタンス自体を返す必要があります。

この関数には、 PyIter_Next()と同じ署名があります。

このフィールドはサブタイプに継承されます。

struct PyMethodDef *PyTypeObject.tp_methods

このタイプの通常のメソッドを宣言する、 PyMethodDef 構造体の静的NULLで終了する配列へのオプションのポインター。

配列内のエントリごとに、メソッド記述子を含むエントリがタイプのディクショナリに追加されます(以下の tp_dict を参照)。

このフィールドはサブタイプに継承されません(メソッドは別のメカニズムを介して継承されます)。

struct PyMemberDef *PyTypeObject.tp_members

このタイプのインスタンスの通常のデータメンバー(フィールドまたはスロット)を宣言する、 PyMemberDef 構造の静的NULLで終了する配列へのオプションのポインター。

配列内のエントリごとに、メンバー記述子を含むエントリがタイプのディクショナリに追加されます(以下の tp_dict を参照)。

このフィールドはサブタイプに継承されません(メンバーは別のメカニズムを介して継承されます)。

struct PyGetSetDef *PyTypeObject.tp_getset

このタイプのインスタンスの計算された属性を宣言する、 PyGetSetDef 構造の静的NULLで終了する配列へのオプションのポインター。

配列内のエントリごとに、getset記述子を含むエントリがタイプのディクショナリに追加されます(以下の tp_dict を参照)。

このフィールドはサブタイプに継承されません(計算された属性は別のメカニズムを介して継承されます)。

PyTypeObject *PyTypeObject.tp_base

タイププロパティが継承される基本タイプへのオプションのポインタ。 このレベルでは、単一の継承のみがサポートされます。 多重継承では、メタタイプを呼び出して型オブジェクトを動的に作成する必要があります。

このフィールドは(明らかに)サブタイプに継承されませんが、デフォルトで&PyBaseObject_Type(Pythonプログラマーにはタイプオブジェクトとして知られています)になります。

PyObject *PyTypeObject.tp_dict

タイプの辞書は、 PyType_Ready()によってここに保存されます。

このフィールドは通常、PyType_Readyが呼び出される前にNULLに初期化する必要があります。 タイプの初期属性を含むディクショナリに初期化することもできます。 PyType_Ready()が型を初期化すると、オーバーロードされた操作(__add__()など)に対応しない場合にのみ、型の追加属性をこのディクショナリに追加できます。

このフィールドはサブタイプに継承されません(ただし、ここで定義されている属性は別のメカニズムを介して継承されます)。

警告

PyDict_SetItem()を使用したり、辞書C-APIを使用して tp_dict を変更したりすることは安全ではありません。

descrgetfunc PyTypeObject.tp_descr_get

「記述子get」関数へのオプションのポインター。

関数のシグネチャは

PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);

このフィールドはサブタイプに継承されます。

descrsetfunc PyTypeObject.tp_descr_set

記述子の値を設定および削除するための関数へのオプションのポインター。

関数のシグネチャは

int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);

value 引数をNULLに設定すると、値が削除されます。 このフィールドはサブタイプに継承されます。

Py_ssize_t PyTypeObject.tp_dictoffset

このタイプのインスタンスにインスタンス変数を含むディクショナリがある場合、このフィールドはゼロ以外であり、インスタンス変数ディクショナリのタイプのインスタンスのオフセットが含まれます。 このオフセットは、 PyObject_GenericGetAttr()によって使用されます。

このフィールドを tp_dict と混同しないでください。 これは、タイプオブジェクト自体の属性の辞書です。

このフィールドの値がゼロより大きい場合は、インスタンス構造の先頭からのオフセットを指定します。 値がゼロ未満の場合は、インスタンス構造の end からのオフセットを指定します。 負のオフセットは使用するのに費用がかかるため、インスタンス構造に可変長の部分が含まれている場合にのみ使用する必要があります。 これは、たとえば、 str または tuple のサブタイプにインスタンス変数ディクショナリを追加するために使用されます。 tp_basicsize フィールドは、ディクショナリが基本オブジェクトレイアウトに含まれていない場合でも、その場合に最後に追加されたディクショナリを考慮する必要があることに注意してください。 ポインタサイズが4バイトのシステムでは、 tp_dictoffset-4に設定して、辞書が構造体の最後にあることを示す必要があります。

インスタンス内の実際のディクショナリオフセットは、次のように負の tp_dictoffset から計算できます。

dictoffset = tp_basicsize + abs(ob_size)*tp_itemsize + tp_dictoffset
if dictoffset is not aligned on sizeof(void*):
    round up to sizeof(void*)

ここで、 tp_basicsizetp_itemsizetp_dictoffset は型オブジェクトから取得され、ob_sizeはインスタンスから取得されます。 intはob_sizeの符号を使用して数値の符号を格納するため、絶対値が使用されます。 (この計算を自分で行う必要はありません。_PyObject_GetDictPtr()によって行われます。)

このフィールドはサブタイプに継承されますが、以下のルールを参照してください。 サブタイプはこのオフセットをオーバーライドできます。 これは、サブタイプインスタンスが基本タイプとは異なるオフセットでディクショナリを格納することを意味します。 辞書は常に tp_dictoffset を介して検出されるため、これは問題にはなりません。

クラスステートメントで定義された型に __ slots __ 宣言がなく、その基本型のいずれにもインスタンス変数ディクショナリがない場合、ディクショナリスロットがインスタンスレイアウトに追加され、 tp_dictoffset はそのスロットのオフセットに設定します。

クラスステートメントで定義された型に__slots__宣言がある場合、その型はその tp_dictoffset を基本型から継承します。

__ dict __ という名前のスロットを__slots__宣言に追加しても、期待される効果は得られず、混乱を招くだけです。 たぶん、これは__weakref__のような機能として追加する必要があります。)

initproc PyTypeObject.tp_init

インスタンス初期化関数へのオプションのポインター。

この関数は、クラスの__init__()メソッドに対応します。 __init__()と同様に、__init__()を呼び出さずにインスタンスを作成でき、__init__()メソッドを再度呼び出すことでインスタンスを再初期化できます。

関数のシグネチャは

int tp_init(PyObject *self, PyObject *args, PyObject *kwds)

self引数は、初期化されるインスタンスです。 args および kwds 引数は、__init__()の呼び出しの位置引数とキーワード引数を表します。

tp_init 関数は、NULLでない場合、型の tp_new 関数が型のインスタンスを返した後、その型を呼び出すことによってインスタンスが正常に作成されたときに呼び出されます。 。 tp_new 関数が、元のタイプのサブタイプではない他のタイプのインスタンスを返す場合、 tp_init 関数は呼び出されません。 tp_new が元のタイプのサブタイプのインスタンスを返す場合、サブタイプの tp_init が呼び出されます。

このフィールドはサブタイプに継承されます。

allocfunc PyTypeObject.tp_alloc

インスタンス割り当て関数へのオプションのポインタ。

関数のシグネチャは

PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems)

この関数の目的は、メモリ割り当てをメモリ初期化から分離することです。 インスタンスに適切な長さのメモリブロックへのポインタを返し、適切に配置され、ゼロに初期化されますが、ob_refcnt1に設定され、ob_typeはに設定されます。 type引数。 タイプの tp_itemsize がゼロ以外の場合、オブジェクトのob_sizeフィールドは nitems に初期化され、割り当てられたメモリブロックの長さはtp_basicsize + nitems*tp_itemsizeである必要があります。 ]、sizeof(void*)の倍数に切り上げられます。 それ以外の場合、 nitems は使用されず、ブロックの長さは tp_basicsize である必要があります。

追加のメモリを割り当てるためであっても、他のインスタンスの初期化を行うためにこの関数を使用しないでください。 これは tp_new で行う必要があります。

このフィールドは静的サブタイプに継承されますが、動的サブタイプ(クラスステートメントによって作成されたサブタイプ)には継承されません。 後者の場合、このフィールドは常に PyType_GenericAlloc()に設定され、標準のヒープ割り当て戦略を強制します。 これは、静的に定義された型の推奨値でもあります。

newfunc PyTypeObject.tp_new

インスタンス作成関数へのオプションのポインター。

この関数が特定のタイプのNULLである場合、そのタイプを呼び出して新しいインスタンスを作成することはできません。 おそらく、ファクトリ関数のように、インスタンスを作成する他の方法があります。

関数のシグネチャは

PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)

サブタイプ引数は、作成されるオブジェクトのタイプです。 args および kwds 引数は、型の呼び出しの位置引数とキーワード引数を表します。 サブタイプは、 tp_new 関数が呼び出されるタイプと同じである必要はないことに注意してください。 そのタイプのサブタイプである可能性があります(ただし、無関係のタイプではありません)。

tp_new 関数は、subtype->tp_alloc(subtype, nitems)を呼び出してオブジェクトにスペースを割り当て、絶対に必要なだけの初期化を実行する必要があります。 安全に無視または繰り返すことができる初期化は、 tp_init ハンドラーに配置する必要があります。 経験則として、不変型の場合、すべての初期化は tp_new で行う必要がありますが、可変型の場合、ほとんどの初期化は tp_init に延期する必要があります。

このフィールドは、 tp_baseNULLまたは&PyBaseObject_Typeである静的型によって継承されないことを除いて、サブタイプによって継承されます。

destructor PyTypeObject.tp_free

インスタンスの割り当て解除関数へのオプションのポインター。 その署名はfreefuncです。

void tp_free(void *)

この署名と互換性のあるイニシャライザーは PyObject_Free()です。

このフィールドは静的サブタイプに継承されますが、動的サブタイプ(クラスステートメントによって作成されたサブタイプ)には継承されません。 後者の場合、このフィールドは、 PyType_GenericAlloc()Py_TPFLAGS_HAVE_GC フラグビットの値を一致させるのに適したデアロケーターに設定されます。

inquiry PyTypeObject.tp_is_gc

ガベージコレクターによって呼び出される関数へのオプションのポインター。

ガベージコレクターは、特定のオブジェクトが収集可能かどうかを知る必要があります。 通常は、オブジェクトのタイプの tp_flags フィールドを確認し、 Py_TPFLAGS_HAVE_GC フラグビットを確認するだけで十分です。 ただし、一部のタイプには静的に割り当てられたインスタンスと動的に割り当てられたインスタンスが混在しており、静的に割り当てられたインスタンスは収集できません。 このようなタイプは、この関数を定義する必要があります。 収集可能なインスタンスの場合は1を返し、収集不可能なインスタンスの場合は0を返す必要があります。 署名は

int tp_is_gc(PyObject *self)

(これの唯一の例はタイプ自体です。 メタタイプ PyType_Type は、静的に割り当てられたタイプと動的に割り当てられたタイプを区別するためにこの関数を定義します。)

このフィールドはサブタイプに継承されます。

PyObject *PyTypeObject.tp_bases

基本タイプのタプル。

これは、クラスステートメントによって作成された型に設定されます。 静的に定義された型の場合はNULLである必要があります。

このフィールドは継承されません。

PyObject *PyTypeObject.tp_mro

メソッド解決順序で、タイプ自体で始まり、 object で終わる拡張された基本タイプのセットを含むタプル。

このフィールドは継承されません。 PyType_Ready()によって新たに計算されます。

destructor PyTypeObject.tp_finalize

インスタンスファイナライズ関数へのオプションのポインター。 その署名はdestructorです。

void tp_finalize(PyObject *)

tp_finalize が設定されている場合、インタープリターはインスタンスをファイナライズするときに1回呼び出します。 これは、ガベージコレクター(インスタンスが分離された参照サイクルの一部である場合)から、またはオブジェクトの割り当てが解除される直前に呼び出されます。 いずれにせよ、参照サイクルを中断しようとする前に呼び出されることが保証されており、オブジェクトが正常な状態にあることを確認します。

tp_finalize は現在の例外ステータスを変更しないでください。 したがって、重要なファイナライザーを作成するための推奨される方法は次のとおりです。

static void
local_finalize(PyObject *self)
{
    PyObject *error_type, *error_value, *error_traceback;

    /* Save the current exception, if any. */
    PyErr_Fetch(&error_type, &error_value, &error_traceback);

    /* ... */

    /* Restore the saved exception. */
    PyErr_Restore(error_type, error_value, error_traceback);
}

このフィールドを考慮に入れるには(継承を介しても)、 Py_TPFLAGS_HAVE_FINALIZE フラグビットも設定する必要があります。

このフィールドはサブタイプに継承されます。

バージョン3.4の新機能。

も参照してください

「安全なオブジェクトのファイナライズ」( PEP 442

PyObject *PyTypeObject.tp_cache
未使用。 継承されません。 内部でのみ使用。
PyObject *PyTypeObject.tp_subclasses
サブクラスへの弱参照のリスト。 継承されません。 内部でのみ使用。
PyObject *PyTypeObject.tp_weaklist
この型オブジェクトへの弱参照の弱参照リストヘッド。 継承されません。 内部でのみ使用。

残りのフィールドは、機能テストマクロCOUNT_ALLOCSが定義されている場合にのみ定義され、内部使用のみを目的としています。 それらは完全を期すためにここに文書化されています。 これらのフィールドはいずれもサブタイプに継承されません。

Py_ssize_t PyTypeObject.tp_allocs
割り当ての数。
Py_ssize_t PyTypeObject.tp_frees
無料の数。
Py_ssize_t PyTypeObject.tp_maxalloc
同時に割り当てられるオブジェクトの最大数。
PyTypeObject *PyTypeObject.tp_next
ゼロ以外の tp_allocs フィールドを持つ次のタイプのオブジェクトへのポインター。

また、ガベージコレクションされたPythonでは、オブジェクトを作成したスレッドだけでなく、任意のPythonスレッドからtp_deallocを呼び出すことができます(オブジェクトがrefcountサイクルの一部になる場合、そのサイクルは、任意のガベージコレクションによって収集される可能性があります。スレッド)。 tp_deallocが呼び出されるスレッドがグローバルインタープリターロック(GIL)を所有するため、これはPythonAPI呼び出しの問題ではありません。 ただし、破棄されるオブジェクトが他のCまたはC ++ライブラリのオブジェクトを破棄する場合は、tp_deallocを呼び出したスレッドでそれらのオブジェクトを破棄しても、ライブラリの前提に違反しないように注意する必要があります。


番号オブジェクト構造

type PyNumberMethods

この構造体は、オブジェクトが数値プロトコルを実装するために使用する関数へのポインターを保持します。 各関数は、番号プロトコルセクションに記載されている同様の名前の関数によって使用されます。

構造の定義は次のとおりです。

typedef struct {
     binaryfunc nb_add;
     binaryfunc nb_subtract;
     binaryfunc nb_multiply;
     binaryfunc nb_remainder;
     binaryfunc nb_divmod;
     ternaryfunc nb_power;
     unaryfunc nb_negative;
     unaryfunc nb_positive;
     unaryfunc nb_absolute;
     inquiry nb_bool;
     unaryfunc nb_invert;
     binaryfunc nb_lshift;
     binaryfunc nb_rshift;
     binaryfunc nb_and;
     binaryfunc nb_xor;
     binaryfunc nb_or;
     unaryfunc nb_int;
     void *nb_reserved;
     unaryfunc nb_float;

     binaryfunc nb_inplace_add;
     binaryfunc nb_inplace_subtract;
     binaryfunc nb_inplace_multiply;
     binaryfunc nb_inplace_remainder;
     ternaryfunc nb_inplace_power;
     binaryfunc nb_inplace_lshift;
     binaryfunc nb_inplace_rshift;
     binaryfunc nb_inplace_and;
     binaryfunc nb_inplace_xor;
     binaryfunc nb_inplace_or;

     binaryfunc nb_floor_divide;
     binaryfunc nb_true_divide;
     binaryfunc nb_inplace_floor_divide;
     binaryfunc nb_inplace_true_divide;

     unaryfunc nb_index;

     binaryfunc nb_matrix_multiply;
     binaryfunc nb_inplace_matrix_multiply;
} PyNumberMethods;

ノート

バイナリ関数とターナリ関数は、すべてのオペランドの型をチェックし、必要な変換を実装する必要があります(オペランドの少なくとも1つは定義された型のインスタンスです)。 指定されたオペランドに対して演算が定義されていない場合、2進関数と3進関数はPy_NotImplementedを返す必要があり、別のエラーが発生した場合はNULLを返して例外を設定する必要があります。

ノート

nb_reservedフィールドは常にNULLである必要があります。 以前はnb_longと呼ばれていましたが、Python3.0.1で名前が変更されました。


オブジェクト構造のマッピング

type PyMappingMethods
この構造体は、オブジェクトがマッピングプロトコルを実装するために使用する関数へのポインタを保持します。 3つのメンバーがあります。
lenfunc PyMappingMethods.mp_length
この関数は PyMapping_Size()PyObject_Size()によって使用され、同じ署名を持っています。 オブジェクトの長さが定義されていない場合、このスロットはNULLに設定できます。
binaryfunc PyMappingMethods.mp_subscript
この関数は、 PyObject_GetItem()および PySequence_GetSlice()によって使用され、PyObject_GetItem()と同じ署名を持ちます。 PyMapping_Check()関数が1を返すには、このスロットを埋める必要があります。それ以外の場合は、NULLにすることができます。
objobjargproc PyMappingMethods.mp_ass_subscript
この関数は、 PyObject_SetItem()PyObject_DelItem()PyObject_SetSlice()、およびPyObject_DelSlice()によって使用されます。 PyObject_SetItem()と同じ署名がありますが、 vNULLに設定してアイテムを削除することもできます。 このスロットがNULLの場合、オブジェクトはアイテムの割り当てと削除をサポートしていません。


シーケンスオブジェクトの構造

type PySequenceMethods
この構造体は、オブジェクトがシーケンスプロトコルを実装するために使用する関数へのポインタを保持します。
lenfunc PySequenceMethods.sq_length
この関数は PySequence_Size()PyObject_Size()によって使用され、同じ署名を持っています。 また、 sq_item および sq_ass_item スロットを介して負のインデックスを処理するためにも使用されます。
binaryfunc PySequenceMethods.sq_concat
この関数は PySequence_Concat()によって使用され、同じ署名を持っています。 nb_addスロットを介して数値加算を試みた後、+オペレーターによっても使用されます。
ssizeargfunc PySequenceMethods.sq_repeat
この関数は PySequence_Repeat()によって使用され、同じ署名を持っています。 nb_multiplyスロットを介して数値の乗算を試みた後、*オペレーターによっても使用されます。
ssizeargfunc PySequenceMethods.sq_item

この関数は PySequence_GetItem()によって使用され、同じ署名を持っています。 mp_subscript スロットを介してサブスクリプションを試行した後、 PyObject_GetItem()によっても使用されます。 PySequence_Check()関数が1を返すには、このスロットを埋める必要があります。それ以外の場合は、NULLにすることができます。

負のインデックスは次のように処理されます。sq_lengthスロットがいっぱいになると、それが呼び出され、シーケンス長を使用してsq_itemに渡される正のインデックスが計算されます。 sq_lengthNULLの場合、インデックスはそのまま関数に渡されます。

ssizeobjargproc PySequenceMethods.sq_ass_item
この関数は PySequence_SetItem()によって使用され、同じ署名を持っています。 mp_ass_subscript スロットを介してアイテムの割り当てと削除を試みた後、 PyObject_SetItem()および PyObject_DelItem()でも使用されます。 オブジェクトがアイテムの割り当てと削除をサポートしていない場合、このスロットはNULLのままにしておくことができます。
objobjproc PySequenceMethods.sq_contains
この関数は PySequence_Contains()で使用でき、同じ署名があります。 このスロットはNULLのままにしておくことができます。この場合、PySequence_Contains()は、一致するものが見つかるまでシーケンスをトラバースするだけです。
binaryfunc PySequenceMethods.sq_inplace_concat
この関数は PySequence_InPlaceConcat()によって使用され、同じ署名を持っています。 最初のオペランドを変更して返す必要があります。 このスロットはNULLのままにしておくことができます。この場合、PySequence_InPlaceConcat()PySequence_Concat()にフォールバックします。 また、nb_inplace_addスロットを介して数値のインプレース加算を試みた後、拡張代入+=によっても使用されます。
ssizeargfunc PySequenceMethods.sq_inplace_repeat
この関数は PySequence_InPlaceRepeat()によって使用され、同じ署名を持っています。 最初のオペランドを変更して返す必要があります。 このスロットはNULLのままにしておくことができます。この場合、PySequence_InPlaceRepeat()PySequence_Repeat()にフォールバックします。 また、nb_inplace_multiplyスロットを介して数値のインプレース乗算を試行した後、拡張代入*=によっても使用されます。


バッファオブジェクトの構造

type PyBufferProcs
この構造体は、バッファプロトコルに必要な関数へのポインタを保持します。 プロトコルは、エクスポータオブジェクトがその内部データをコンシューマオブジェクトに公開する方法を定義します。
getbufferproc PyBufferProcs.bf_getbuffer

この関数のシグネチャは次のとおりです。

int (PyObject *exporter, Py_buffer *view, int flags);

flags で指定されているように、 exporter へのリクエストを処理して view に入力します。 ポイント(3)を除いて、この関数の実装は次の手順を実行する必要があります。

  1. リクエストに対応できるか確認してください。 そうでない場合は、PyExc_BufferErrorを上げ、view->objNULLに設定して、-1を返します。

  2. 要求されたフィールドに入力します。

  3. エクスポート数の内部カウンターをインクリメントします。

  4. view->objexporter に設定し、view->objをインクリメントします。

  5. 0を返します。

exporter がバッファープロバイダーのチェーンまたはツリーの一部である場合、2つの主要なスキームを使用できます。

  • 再エクスポート:ツリーの各メンバーはエクスポートオブジェクトとして機能し、view->objをそれ自体への新しい参照に設定します。

  • リダイレクト:バッファ要求はツリーのルートオブジェクトにリダイレクトされます。 ここで、view->objはルートオブジェクトへの新しい参照になります。

ビューの個々のフィールドについては、セクションバッファ構造で説明しています。エクスポータが特定のリクエストにどのように対応する必要があるかについてのルールは、セクションバッファリクエストタイプにあります。

Py_buffer 構造体でポイントされているすべてのメモリはエクスポータに属し、コンシューマがなくなるまで有効なままである必要があります。 formatshapestridessuboffsets、およびinternalは、コンシューマーに対して読み取り専用です。

PyBuffer_FillInfo()は、すべての要求タイプを正しく処理しながら、単純なバイトバッファーを公開する簡単な方法を提供します。

PyObject_GetBuffer()は、この関数をラップするコンシューマー用のインターフェースです。

releasebufferproc PyBufferProcs.bf_releasebuffer

この関数のシグネチャは次のとおりです。

void (PyObject *exporter, Py_buffer *view);

バッファーのリソースを解放する要求を処理します。 リソースを解放する必要がない場合、 PyBufferProcs.bf_releasebufferNULLの場合があります。 それ以外の場合、この関数の標準実装は次のオプションの手順を実行します。

  1. エクスポート数の内部カウンターをデクリメントします。

  2. カウンタが0の場合、ビューに関連付けられているすべてのメモリを解放します。

エクスポータは、バッファ固有のリソースを追跡するためにinternalフィールドを使用する必要があります。 このフィールドは一定のままであることが保証されていますが、コンシューマーは元のバッファーのコピーを view 引数として渡すことができます(MAY)。

この関数はview->objをデクリメントしてはなりません。これは PyBuffer_Release()で自動的に行われるためです(このスキームは参照サイクルを中断するのに役立ちます)。

PyBuffer_Release()は、この関数をラップするコンシューマー用のインターフェースです。


非同期オブジェクト構造

バージョン3.5の新機能。


type PyAsyncMethods

この構造体は、 awaitable および asynchronous iterator オブジェクトを実装するために必要な関数へのポインターを保持します。

構造の定義は次のとおりです。

typedef struct {
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
} PyAsyncMethods;
unaryfunc PyAsyncMethods.am_await

この関数のシグネチャは次のとおりです。

PyObject *am_await(PyObject *self)

返されるオブジェクトはイテレータである必要があります。 PyIter_Check()は、1を返す必要があります。

オブジェクトが待機可能でない場合、このスロットはNULLに設定できます。

unaryfunc PyAsyncMethods.am_aiter

この関数のシグネチャは次のとおりです。

PyObject *am_aiter(PyObject *self)

awaitable オブジェクトを返す必要があります。 詳細については、__anext__()を参照してください。

オブジェクトが非同期反復プロトコルを実装していない場合、このスロットはNULLに設定できます。

unaryfunc PyAsyncMethods.am_anext

この関数のシグネチャは次のとおりです。

PyObject *am_anext(PyObject *self)

awaitable オブジェクトを返す必要があります。 詳細については、__anext__()を参照してください。 このスロットはNULLに設定できます。