共通のオブジェクト構造体 (common object structure)¶
Python のオブジェクト型の定義には、多数の構造体が使われます。 この節では、それらの構造体と使い方を説明します。
基本のオブジェクト型とマクロ¶
すべての Python オブジェクトは、メモリ上の表現の先頭に少数の共通フィールドを持ちます。
これらを表すのが PyObject 型と PyVarObject 型です。
これらの型はマクロの展開によって定義され、そのマクロは他のすべての Python オブジェクトの定義でも直接的または間接的に使われます。
その他のマクロについては 参照カウント を参照してください。
-
type PyObject¶
- 次に属します: Limited API. (いくつかのメンバーのみが安定 ABI です。)
全てのオブジェクト型はこの型を拡張したものです。 この型には、あるオブジェクトを指すポインタをオブジェクトとして Python から扱うのに必要な情報が入っています。 通常の "リリース" ビルドでは、この構造体にはオブジェクトの参照カウントとオブジェクトに対応する型オブジェクトだけが入っています。 実際には
PyObjectであることは宣言されていませんが、全ての Python オブジェクトへのポインタは PyObject* へキャストできます。 メンバにアクセスするにはPy_REFCNTマクロとPy_TYPEマクロを使わなければなりません。
-
type PyVarObject¶
- 次に属します: Limited API. (いくつかのメンバーのみが安定 ABI です。)
This is an extension of
PyObjectthat adds theob_sizefield. This is only used for objects that have some notion of length. This type does not often appear in the Python/C API. Access to the members must be done by using the macrosPy_REFCNT,Py_TYPE, andPy_SIZE.
-
PyObject_HEAD¶
可変な長さを持たないオブジェクトを表現する新しい型を宣言するときに使うマクロです。 PyObject_HEAD マクロは次のように展開されます:
PyObject ob_base;
上にある
PyObjectのドキュメントを参照してください。
-
PyObject_VAR_HEAD¶
インスタンスごとに異なる長さを持つオブジェクトを表現する新しい型を宣言するときに使うマクロです。 PyObject_VAR_HEAD マクロは次のように展開されます:
PyVarObject ob_base;
上にある
PyVarObjectのドキュメントを参照してください。
-
PyTypeObject PyBaseObject_Type¶
- 次に属します: Stable ABI.
他のすべてのオブジェクトの基底クラスで、Python の
objectと同じです。
-
int Py_Is(PyObject *x, PyObject *y)¶
- 次に属します: Stable ABI (バージョン 3.10 より).
オブジェクト x がオブジェクト y かどうかを調べます。 Python の
x is yと同じです。Added in version 3.10.
-
int Py_IsNone(PyObject *x)¶
- 次に属します: Stable ABI (バージョン 3.10 より).
オブジェクトが
Noneシングルトンかどうかを調べます。 Python のx is Noneと同じです。Added in version 3.10.
-
int Py_IsTrue(PyObject *x)¶
- 次に属します: Stable ABI (バージョン 3.10 より).
オブジェクトが
Trueシングルトンかどうかを調べます。 Python のx is Trueと同じです。Added in version 3.10.
-
int Py_IsFalse(PyObject *x)¶
- 次に属します: Stable ABI (バージョン 3.10 より).
オブジェクトが
Falseシングルトンかどうかを調べます。 Python のx is Falseと同じです。Added in version 3.10.
-
PyTypeObject *Py_TYPE(PyObject *o)¶
- 戻り値: 借用参照。
Python オブジェクト o の型を取得します。
Return a borrowed reference.
Use the
Py_SET_TYPE()function to set an object type.
-
int Py_IS_TYPE(PyObject *o, PyTypeObject *type)¶
オブジェクト o の型が type ならゼロ以外、それ以外ならゼロを返します。
Py_TYPE(o) == typeと同等です。Added in version 3.9.
-
void Py_SET_TYPE(PyObject *o, PyTypeObject *type)¶
Set the object o type to type.
Added in version 3.9.
-
Py_ssize_t Py_SIZE(PyVarObject *o)¶
Get the size of the Python object o.
Use the
Py_SET_SIZE()function to set an object size.バージョン 3.11 で変更:
Py_SIZE()が static なインライン関数になりました。 引数の型は const PyVarObject* ではなくなりました。
-
void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)¶
Set the object o size to size.
Added in version 3.9.
-
PyObject_HEAD_INIT(type)¶
新しい
PyObject型のための初期値に展開するマクロです。このマクロは次のように展開されます。_PyObject_EXTRA_INIT 1, type,
-
PyVarObject_HEAD_INIT(type, size)¶
ob_sizeフィールドを含む、新しいPyVarObject型の初期値に展開されるマクロです。 次のように展開されます。_PyObject_EXTRA_INIT 1, type, size,
関数とメソッドの実装¶
-
type PyCFunction¶
- 次に属します: Stable ABI.
Python の呼び出し可能オブジェクトの多くを C で実装するための関数の型です。 この型の関数は 2 つの PyObject* 引数を受け取り、同じ型の値を返します。 戻り値が
NULLの場合、例外が設定されていなければなりません。NULLでない場合は、Python に公開された関数の戻り値として扱われます。 この関数は新しい参照を返さなければなりません。関数のシグネチャは次のとおりです
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords¶
- 次に属します: Stable ABI.
METH_VARARGS | METH_KEYWORDS のシグネチャを持つ Python の呼び出し可能オブジェクトを C で実装するための関数の型です。 シグネチャは次のとおりです。
PyObject *PyCFunctionWithKeywords(PyObject *self, PyObject *args, PyObject *kwargs);
-
type PyCFunctionFast¶
- 次に属します: Stable ABI (バージョン 3.13 より).
METH_FASTCALLのシグネチャを持つ Python の呼び出し可能オブジェクトを C で実装するための関数の型です。 シグネチャは次のとおりです。PyObject *PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type PyCFunctionFastWithKeywords¶
- 次に属します: Stable ABI (バージョン 3.13 より).
METH_FASTCALL | METH_KEYWORDS のシグネチャを持つ Python の呼び出し可能オブジェクトを C で実装するための関数の型です。 シグネチャは次のとおりです。
PyObject *PyCFunctionFastWithKeywords(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames);
-
type PyCMethod¶
METH_METHOD | METH_FASTCALL | METH_KEYWORDS のシグネチャを持つ Python の呼び出し可能オブジェクトを C で実装するための関数の型です。 シグネチャは次のとおりです。
PyObject *PyCMethod(PyObject *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Added in version 3.9.
-
type PyMethodDef¶
- 次に属します: Stable ABI (すべてのメンバーを含む).
拡張型のメソッドを記述する際に用いる構造体です。この構造体には 4 つのフィールドがあります:
-
const char *ml_name¶
メソッドの名前。
-
PyCFunction ml_meth¶
C での実装へのポインタ。
-
int ml_flags¶
呼び出しの構成方法を示すフラグビット。
-
const char *ml_doc¶
ドキュメント文字列の内容へのポインタ。
-
const char *ml_name¶
ml_meth は C の関数ポインタです。
関数の型はさまざまですが、戻り値は常に PyObject* です。
関数が PyCFunction 型でない場合、メソッドテーブル内でのキャストがコンパイラから要求されます。
PyCFunction では第 1 引数を PyObject* と定義していますが、メソッドの実装では self オブジェクト固有の C 型を使うのが一般的です。
ml_flags フィールドは、次のフラグを含められるビットフィールドです。
各フラグは呼び出し規約または束縛の規約を示します。
次の呼び出し規約があります。
-
METH_VARARGS¶
- 次に属します: Stable ABI.
PyCFunction型のメソッドで典型的に使われる呼び出し規約です。関数は PyObject* 型の引数値を二つ要求します。最初の引数はメソッドの self オブジェクトです; モジュール関数の場合、これはモジュールオブジェクトです。第二のパラメタ (よく args と呼ばれます) は、全ての引数を表現するタプルオブジェクトです。パラメタは通常、PyArg_ParseTuple()やPyArg_UnpackTuple()で処理されます。
-
METH_KEYWORDS¶
他のフラグとの特定の組み合わせでのみ使えます。 使えるのは METH_VARARGS | METH_KEYWORDS、METH_FASTCALL | METH_KEYWORDS、METH_METHOD | METH_FASTCALL | METH_KEYWORDS です。
- METH_VARARGS | METH_KEYWORDS
これらのフラグを持つメソッドは
PyCFunctionWithKeywords型でなければなりません。 この関数は self、args、kwargs の 3 引数を受け取ります。 kwargs はすべてのキーワード引数を含む辞書で、キーワード引数がなければNULLの場合もあります。 通常はPyArg_ParseTupleAndKeywords()で引数を処理します。
-
METH_FASTCALL¶
- 次に属します: Stable ABI (バージョン 3.10 より).
位置引数のみをサポートする高速な呼び出し規約です。 メソッドは
PyCFunctionFast型です。 第 1 引数は self、第 2 引数は引数を表す PyObject* 値の C 配列、第 3 引数は引数の個数 (配列の長さ) です。Added in version 3.7.
バージョン 3.10 で変更:
METH_FASTCALLが Stable ABI の一部になりました。
- METH_FASTCALL | METH_KEYWORDS
METH_FASTCALLを拡張してキーワード引数もサポートするもので、メソッドはPyCFunctionFastWithKeywords型です。 キーワード引数は vectorcall プロトコル と同じ方法で渡されます。 PyObject* 型の第 4 引数が追加され、キーワード引数の名前 (文字列であることが保証されます) のタプルを渡します。 キーワード引数がなければNULLの場合もあります。 キーワード引数の値は args 配列の位置引数の後に格納されます。Added in version 3.7.
-
METH_METHOD¶
- 次に属します: Stable ABI (バージョン 3.7 より).
他のフラグとの組み合わせ METH_METHOD | METH_FASTCALL | METH_KEYWORDS でのみ使えます。
- METH_METHOD | METH_FASTCALL | METH_KEYWORDS
METH_FASTCALL | METH_KEYWORDS を拡張し、定義元のクラス、つまりそのメソッドを含むクラスを扱えるようにしたものです。 定義元のクラスは
Py_TYPE(self)の基底クラスである場合もあります。メソッドは
PyCMethod型でなければなりません。 これはMETH_FASTCALL | METH_KEYWORDSと同じですが、selfの後にdefining_class引数が追加されています。Added in version 3.9.
-
METH_NOARGS¶
- 次に属します: Stable ABI.
引数を取らないメソッドに
METH_NOARGSフラグを指定すると、引数が渡されたかどうかをメソッド内で確認する必要がなくなります。 このメソッドはPyCFunction型でなければなりません。 第 1 引数は通常 self という名前で、モジュールまたはオブジェクトのインスタンスへの参照を保持します。 第 2 引数は常にNULLです。関数には 2 つの引数が必要です。 第 2 引数は使わないので、
Py_UNUSEDでコンパイラの警告を抑制できます。
-
METH_O¶
- 次に属します: Stable ABI.
オブジェクトを 1 つ引数に取るメソッドには、
"O"を指定してPyArg_ParseTuple()を呼び出す代わりに、METH_Oフラグを指定できます。 メソッドはPyCFunction型で、self 引数と、唯一の引数を表す PyObject* 引数を受け取ります。
These two constants are not used to indicate the calling convention but the binding when used with methods of classes. These may not be used for functions defined for modules. At most one of these flags may be set for any given method.
-
METH_CLASS¶
- 次に属します: Stable ABI.
The method will be passed the type object as the first parameter rather than an instance of the type. This is used to create class methods, similar to what is created when using the
@classmethodbuilt-in decorator.
-
METH_STATIC¶
- 次に属します: Stable ABI.
The method will be passed
NULLas the first parameter rather than an instance of the type. This is used to create static methods, similar to what is created when using the@staticmethodbuilt-in decorator.
もう一つの定数は、あるメソッドを同名の別のメソッド定義と置き換えるかどうかを制御します。
-
METH_COEXIST¶
- 次に属します: Stable ABI.
既存の定義を置き換えてメソッドを登録します。 METH_COEXIST がない場合、デフォルトでは重複する定義をスキップします。 スロットラッパーはメソッドテーブルより先に登録されるため、例えば sq_contains スロットがあると、
__contains__()という名前のラップされたメソッドが生成され、同じ名前に対応する PyCFunction は登録されません。 このフラグがある場合、ラッパーオブジェクトの代わりに PyCFunction が登録され、スロットと共存します。 PyCFunction の呼び出しはラッパーオブジェクトの呼び出しより最適化されているので、この方法が役立ちます。
-
PyTypeObject PyCMethod_Type¶
The type object corresponding to Python C method objects. This is available as
types.BuiltinMethodTypein the Python layer.
-
int PyCMethod_Check(PyObject *op)¶
Return true if op is an instance of the
PyCMethod_Typetype or a subtype of it. This function always succeeds.
-
int PyCMethod_CheckExact(PyObject *op)¶
This is the same as
PyCMethod_Check(), but does not account for subtypes.
-
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.9 より).
ml を Python の 呼び出し可能 オブジェクトにします。 呼び出し側は、ml がその 呼び出し可能 オブジェクトより長く存続するようにしなければなりません。 通常、ml は静的変数として定義します。
self 引数は、
ml->ml_methの C 関数を呼び出すときに、その関数の self 引数として渡されます。 self はNULLにできます。渡された module 引数から、呼び出し可能 オブジェクトの
__module__属性を設定できます。 module は Python の文字列で、関数の定義元モジュールの名前として使われます。 名前が分からない場合はNoneまたはNULLにできます。cls 引数は C 関数の defining_class 引数として渡されます。
ml->ml_flagsにMETH_METHODが設定されている場合は、指定する必要があります。Added in version 3.9.
-
PyTypeObject PyCFunction_Type¶
- 次に属します: Stable ABI.
The type object corresponding to Python C function objects. This is available as
types.BuiltinFunctionTypein the Python layer.
-
int PyCFunction_Check(PyObject *op)¶
Return true if op is an instance of the
PyCFunction_Typetype or a subtype of it. This function always succeeds.
-
int PyCFunction_CheckExact(PyObject *op)¶
This is the same as
PyCFunction_Check(), but does not account for subtypes.
-
PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyCMethod_New(ml, self, module, NULL)と同等です。
-
PyObject *PyCFunction_New(PyMethodDef *ml, PyObject *self)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.4 より).
PyCMethod_New(ml, self, NULL, NULL)と同等です。
-
int PyCFunction_GetFlags(PyObject *func)¶
- 次に属します: Stable ABI.
Get the function's flags on func as they were passed to
ml_flags.If func is not a C function object, this fails with an exception. func must not be
NULL.This function returns the function's flags on success, and
-1with an exception set on failure.
-
int PyCFunction_GET_FLAGS(PyObject *func)¶
This is the same as
PyCFunction_GetFlags(), but without error or type checking.
-
PyCFunction PyCFunction_GetFunction(PyObject *func)¶
- 次に属します: Stable ABI.
Get the function pointer on func as it was passed to
ml_meth.If func is not a C function object, this fails with an exception. func must not be
NULL.This function returns the function pointer on success, and
NULLwith an exception set on failure.
-
int PyCFunction_GET_FUNCTION(PyObject *func)¶
This is the same as
PyCFunction_GetFunction(), but without error or type checking.
-
PyObject *PyCFunction_GetSelf(PyObject *func)¶
- 次に属します: Stable ABI.
Get the "self" object on func. This is the object that would be passed to the first argument of a
PyCFunction. For C function objects created through aPyMethodDefon aPyModuleDef, this is the resulting module object.If func is not a C function object, this fails with an exception. func must not be
NULL.This function returns a borrowed reference to the "self" object on success, and
NULLwith an exception set on failure.
-
PyObject *PyCFunction_GET_SELF(PyObject *func)¶
This is the same as
PyCFunction_GetSelf(), but without error or type checking.
拡張型の属性へのアクセス¶
-
type PyMemberDef¶
- 次に属します: Stable ABI (すべてのメンバーを含む).
C 構造体のメンバーに対応する、型の属性を記述する構造体です。 クラスを定義するときは、この構造体の NULL で終端した配列を
tp_membersスロットに設定します。フィールドは順に次のとおりです。
-
const char *name¶
メンバーの名前。 NULL 値は
PyMemberDef[]配列の終端を示します。文字列は静的に割り当てられている必要があります。 コピーは作成されません。
-
Py_ssize_t offset¶
その型のオブジェクト構造体内での、メンバーのバイト単位のオフセット。
デフォルト (
flagsが0の場合) では、メンバーは読み書きの両方を許可します。 読み取り専用にするにはPy_READONLYフラグを使ってください。Py_T_STRINGなど、一部の型はPy_READONLYを暗黙に指定します。 削除できるのはPy_T_OBJECT_EX(および従来のT_OBJECT) のメンバーだけです。For heap-allocated types (created using
PyType_FromSpec()or similar),PyMemberDefmay contain a definition for the special member"__vectorcalloffset__", corresponding totp_vectorcall_offsetin type objects. These must be defined withPy_T_PYSSIZETandPy_READONLY, for example:static PyMemberDef spam_type_members[] = { {"__vectorcalloffset__", Py_T_PYSSIZET, offsetof(Spam_object, vectorcall), Py_READONLY}, {NULL} /* 終端 */ };
(
offsetof()を使うには#include <stddef.h>が必要な場合があります。)従来のオフセット
tp_dictoffsetとtp_weaklistoffsetも、"__dictoffset__"メンバーと"__weaklistoffset__"メンバーを使って同様に定義できます。 ただし、拡張モジュールでは代わりにPy_TPFLAGS_MANAGED_DICTとPy_TPFLAGS_MANAGED_WEAKREFを使うことを強く推奨します。バージョン 3.12 で変更:
PyMemberDefが常に利用可能になりました。 以前は"structmember.h"のインクルードが必要でした。 -
const char *name¶
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)¶
- 次に属します: Stable ABI.
アドレス obj_addr にあるオブジェクトの属性を取得します。 属性は
PyMemberDefm で記述します。 エラー時はNULLを返します。バージョン 3.12 で変更:
PyMember_GetOneが常に利用可能になりました。 以前は"structmember.h"のインクルードが必要でした。
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)¶
- 次に属します: Stable ABI.
アドレス obj_addr にあるオブジェクトの属性を、オブジェクト o に設定します。 設定する属性は
PyMemberDefm で記述します。 成功すると0、失敗すると負の値を返します。バージョン 3.12 で変更:
PyMember_SetOneが常に利用可能になりました。 以前は"structmember.h"のインクルードが必要でした。
メンバーのフラグ¶
PyMemberDef.flags には次のフラグを使えます。
-
Py_READONLY¶
- 次に属します: Stable ABI (バージョン 3.12 より).
書き込み不可。
-
Py_AUDIT_READ¶
- 次に属します: Stable ABI (バージョン 3.12 より).
読み取り前に
object.__getattr__監査イベント を発行します。
-
Py_RELATIVE_OFFSET¶
- 次に属します: Stable ABI (バージョン 3.12 より).
この
PyMemberDefエントリーのoffsetが、PyObjectからではなく、サブクラス固有のデータからのオフセットであることを示します。Can only be used as part of
Py_tp_membersslotwhen creating a class using negativebasicsize. It is mandatory in that case.This flag is only used in
PyType_Slot. When settingtp_membersduring class creation, Python clears it and setsPyMemberDef.offsetto the offset from thePyObjectstruct.
バージョン 3.10 で変更: #include "structmember.h" で利用できる RESTRICTED、READ_RESTRICTED、WRITE_RESTRICTED マクロは非推奨です。
READ_RESTRICTED と RESTRICTED は Py_AUDIT_READ と同等で、WRITE_RESTRICTED は何もしません。
バージョン 3.12 で変更: The READONLY macro was renamed to Py_READONLY.
The PY_AUDIT_READ macro was renamed with the Py_ prefix.
The new names are now always available.
Previously, these required #include "structmember.h".
The header is still available and it provides the old names.
メンバーの型¶
PyMemberDef.type には、各種の C の型に対応する以下のマクロのいずれかを指定できます。
Python からメンバーにアクセスすると、対応する Python の型に変換されます。
Python から設定するときは、C の型に変換されます。
変換できない場合は TypeError や ValueError などの例外が送出されます。
Unless marked (D), attributes defined this way cannot be deleted
using e.g. del or delattr().
マクロ名 |
C の型 |
Python の型 |
|---|---|---|
|
char |
|
|
short |
|
|
int |
|
|
long |
|
|
long long |
|
|
unsigned char |
|
|
unsigned int |
|
|
unsigned short |
|
|
unsigned long |
|
|
unsigned long long |
|
|
||
|
float |
|
|
double |
|
|
char (書き込まれる値は 0 または 1) |
|
|
const char* (*) |
|
|
const char[] (*) |
|
|
char (0-127) |
|
|
|
(*): ゼロで終端された UTF-8 エンコードの C 文字列です。
Py_T_STRINGでは C 側の表現はポインタで、Py_T_STRING_INPLACEでは文字列を構造体に直接格納します。(**): 長さ 1 の文字列です。 ASCII だけを受け付けます。
(RO):
Py_READONLYが暗黙に指定されます。(D): 削除できます。 削除するとポインタは
NULLになります。NULLポインタを読み取るとAttributeErrorが送出されます。
Added in version 3.12: 以前のバージョンでは、これらのマクロは #include "structmember.h" でのみ利用でき、Py_ 接頭辞のない名前 (例えば T_INT) が使われていました。
このヘッダーは引き続き利用でき、従来の名前に加えて、次の非推奨の型も含みます。
-
T_OBJECT¶
Py_T_OBJECT_EXと似ていますが、NULLはNoneに変換されます。 このため Python では、属性を削除すると実質的にNoneを設定することになるという、意外な動作になります。
-
T_NONE¶
常に
None。Py_READONLYとともに使わなければなりません。
ゲッターとセッターの定義¶
-
type PyGetSetDef¶
- 次に属します: Stable ABI (すべてのメンバーを含む).
型のプロパティのようなアクセスを定義するための構造体です。
PyTypeObject.tp_getsetスロットの説明も参照してください。-
const char *name¶
属性名
-
const char *doc¶
任意のドキュメンテーション文字列
-
void *closure¶
ゲッターとセッターに追加データを提供する、省略可能なユーザーデータポインタ。
-
const char *name¶
-
typedef PyObject *(*getter)(PyObject*, void*)¶
- 次に属します: Stable ABI.
get関数は、PyObject* 引数 (インスタンス) とユーザーデータポインタ (対応するclosure) を受け取ります。成功すると新しい参照を返し、失敗すると例外を設定して
NULLを返す必要があります。
-
typedef int (*setter)(PyObject*, PyObject*, void*)¶
- 次に属します: Stable ABI.
set関数は、2 つの PyObject* 引数 (インスタンスと設定する値) とユーザーデータポインタ (対応するclosure) を受け取ります。属性を削除する場合、第 2 引数は
NULLです。 成功すると0を返し、失敗すると例外を設定して-1を返す必要があります。