共通のオブジェクト構造体 (common object structure)¶
Python では、オブジェクト型を定義する上で数多くの構造体が使われます。この節では三つの構造体とその利用方法について説明します。
Base object types and macros¶
全ての Python オブジェクトは、オブジェクトのメモリ内表現の先頭部分にある少数のフィールドを完全に共有しています。
このフィールドは PyObject
型および PyVarObject
型で表現されます。
これらの型もまた、他の全ての Python オブジェクトの定義で直接または間接的に使われているマクロを使って定義されています。
-
type PyObject¶
- Part of the Limited API. (Only some members are part of the stable ABI.)
All object types are extensions of this type. This is a type which contains the information Python needs to treat a pointer to an object as an object. In a normal "release" build, it contains only the object's reference count and a pointer to the corresponding type object. Nothing is actually declared to be a
PyObject
, but every pointer to a Python object can be cast to a PyObject*. Access to the members must be done by using the macrosPy_REFCNT
andPy_TYPE
.
-
type PyVarObject¶
- Part of the Limited API. (Only some members are part of the stable ABI.)
PyObject
を拡張して、ob_size
フィールドを追加したものです。 この構造体は、 長さ (length) の概念を持つオブジェクトだけに対して使います。 この型が Python/C API で使われることはほとんどありません。 メンバにアクセスするにはPy_REFCNT
マクロ、Py_TYPE
マクロ、Py_SIZE
マクロを使わなければなりません。
-
PyObject_HEAD¶
可変な長さを持たないオブジェクトを表現する新しい型を宣言するときに使うマクロです。 PyObject_HEAD マクロは次のように展開されます:
PyObject ob_base;
上にある
PyObject
のドキュメントを参照してください。
-
PyObject_VAR_HEAD¶
インスタンスごとに異なる長さを持つオブジェクトを表現する新しい型を宣言するときに使うマクロです。 PyObject_VAR_HEAD マクロは次のように展開されます:
PyVarObject ob_base;
上にある
PyVarObject
のドキュメントを参照してください。
-
int Py_Is(PyObject *x, PyObject *y)¶
- Part of the Stable ABI since version 3.10.
Test if the x object is the y object, the same as
x is y
in Python.バージョン 3.10 で追加.
-
int Py_IsNone(PyObject *x)¶
- Part of the Stable ABI since version 3.10.
Test if an object is the
None
singleton, the same asx is None
in Python.バージョン 3.10 で追加.
-
int Py_IsTrue(PyObject *x)¶
- Part of the Stable ABI since version 3.10.
Test if an object is the
True
singleton, the same asx is True
in Python.バージョン 3.10 で追加.
-
int Py_IsFalse(PyObject *x)¶
- Part of the Stable ABI since version 3.10.
Test if an object is the
False
singleton, the same asx is False
in Python.バージョン 3.10 で追加.
-
PyTypeObject *Py_TYPE(PyObject *o)¶
Get the type of the Python object o.
Return a borrowed reference.
Use the
Py_SET_TYPE()
function to set an object type.
-
int Py_IS_TYPE(PyObject *o, PyTypeObject *type)¶
Return non-zero if the object o type is type. Return zero otherwise. Equivalent to:
Py_TYPE(o) == type
.バージョン 3.9 で追加.
-
void Py_SET_TYPE(PyObject *o, PyTypeObject *type)¶
Set the object o type to type.
バージョン 3.9 で追加.
-
Py_ssize_t Py_REFCNT(PyObject *o)¶
Get the reference count of the Python object o.
Use the
Py_SET_REFCNT()
function to set an object reference count.バージョン 3.11 で変更: The parameter type is no longer const PyObject*.
バージョン 3.10 で変更:
Py_REFCNT()
is changed to the inline static function.
-
void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt)¶
Set the object o reference counter to refcnt.
バージョン 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()
is changed to an inline static function. The parameter type is no longer const PyVarObject*.
-
void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)¶
Set the object o size to size.
バージョン 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,
Implementing functions and methods¶
-
type PyCFunction¶
- Part of the Stable ABI.
Type of the functions used to implement most Python callables in C. Functions of this type take two PyObject* parameters and return one such value. If the return value is
NULL
, an exception shall have been set. If notNULL
, the return value is interpreted as the return value of the function as exposed in Python. The function must return a new reference.関数のシグネチャは次のとおりです
PyObject *PyCFunction(PyObject *self, PyObject *args);
-
type PyCFunctionWithKeywords¶
- Part of the Stable ABI.
Type of the functions used to implement Python callables in C with signature
METH_VARARGS | METH_KEYWORDS
. The function signature is:PyObject *PyCFunctionWithKeywords(PyObject *self, PyObject *args, PyObject *kwargs);
-
type _PyCFunctionFast¶
Type of the functions used to implement Python callables in C with signature
METH_FASTCALL
. The function signature is:PyObject *_PyCFunctionFast(PyObject *self, PyObject *const *args, Py_ssize_t nargs);
-
type _PyCFunctionFastWithKeywords¶
Type of the functions used to implement Python callables in C with signature
METH_FASTCALL | METH_KEYWORDS
. The function signature is:PyObject *_PyCFunctionFastWithKeywords(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames);
-
type PyCMethod¶
Type of the functions used to implement Python callables in C with signature
METH_METHOD | METH_FASTCALL | METH_KEYWORDS
. The function signature is:PyObject *PyCMethod(PyObject *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
バージョン 3.9 で追加.
-
type PyMethodDef¶
- Part of the Stable ABI (including all members).
拡張型のメソッドを記述する際に用いる構造体です。この構造体には 4 つのフィールドがあります:
-
const char *ml_name¶
メソッド名
-
PyCFunction ml_meth¶
C 実装へのポインタ
-
int ml_flags¶
flags bits indicating how the call should be constructed
-
const char *ml_doc¶
docstring の内容を指すポインタ
-
const char *ml_name¶
The ml_meth
is a C function pointer. The functions may be of different
types, but they always return PyObject*. If the function is not of
the PyCFunction
, the compiler will require a cast in the method table.
Even though PyCFunction
defines the first parameter as
PyObject*, it is common that the method implementation uses the
specific C type of the self object.
The ml_flags
field is a bitfield which can include the following flags.
The individual flags indicate either a calling convention or a binding
convention.
There are these calling conventions:
- METH_VARARGS¶
This is the typical calling convention, where the methods have the type
PyCFunction
. The function expects two PyObject* values. The first one is the self object for methods; for module functions, it is the module object. The second parameter (often called args) is a tuple object representing all arguments. This parameter is typically processed usingPyArg_ParseTuple()
orPyArg_UnpackTuple()
.
- METH_VARARGS | METH_KEYWORDS
Methods with these flags must be of type
PyCFunctionWithKeywords
. The function expects three parameters: self, args, kwargs where kwargs is a dictionary of all the keyword arguments or possiblyNULL
if there are no keyword arguments. The parameters are typically processed usingPyArg_ParseTupleAndKeywords()
.
- METH_FASTCALL¶
Fast calling convention supporting only positional arguments. The methods have the type
_PyCFunctionFast
. The first parameter is self, the second parameter is a C array of PyObject* values indicating the arguments and the third parameter is the number of arguments (the length of the array).バージョン 3.7 で追加.
バージョン 3.10 で変更:
METH_FASTCALL
is now part of the stable ABI.
- METH_FASTCALL | METH_KEYWORDS
Extension of
METH_FASTCALL
supporting also keyword arguments, with methods of type_PyCFunctionFastWithKeywords
. Keyword arguments are passed the same way as in the vectorcall protocol: there is an additional fourth PyObject* parameter which is a tuple representing the names of the keyword arguments (which are guaranteed to be strings) or possiblyNULL
if there are no keywords. The values of the keyword arguments are stored in the args array, after the positional arguments.バージョン 3.7 で追加.
- METH_METHOD | METH_FASTCALL | METH_KEYWORDS
Extension of
METH_FASTCALL | METH_KEYWORDS
supporting the defining class, that is, the class that contains the method in question. The defining class might be a superclass ofPy_TYPE(self)
.The method needs to be of type
PyCMethod
, the same as forMETH_FASTCALL | METH_KEYWORDS
withdefining_class
argument added afterself
.バージョン 3.9 で追加.
- METH_NOARGS¶
引数のないメソッドは、
METH_NOARGS
フラグをつけた場合、必要な引数が指定されているかをチェックしなくなります。こうしたメソッドはPyCFunction
型でなくてはなりません。第一のパラメタは self になり、モジュールかオブジェクトインスタンスへの参照を保持することになります。いずれにせよ、第二のパラメタはNULL
になります。The function must have 2 parameters. Since the second parameter is unused,
Py_UNUSED
can be used to prevent a compiler warning.
- METH_O¶
Methods with a single object argument can be listed with the
METH_O
flag, instead of invokingPyArg_ParseTuple()
with a"O"
argument. They have the typePyCFunction
, with the self parameter, and a PyObject* parameter representing the single argument.
以下の二つの定数は、呼び出し規約を示すものではなく、クラスのメソッドとして使う際の束縛方式を示すものです。モジュールに対して定義された関数で用いてはなりません。メソッドに対しては、最大で一つしかこのフラグをセットできません。
- METH_CLASS¶
メソッドの最初の引数には、型のインスタンスではなく型オブジェクトが渡されます。このフラグは組み込み関数
classmethod()
を使って生成するのと同じ クラスメソッド (class method) を生成するために使われます。
- METH_STATIC¶
メソッドの最初の引数には、型のインスタンスではなく
NULL
が渡されます。このフラグは、staticmethod()
を使って生成するのと同じ 静的メソッド (static method) を生成するために使われます。
もう一つの定数は、あるメソッドを同名の別のメソッド定義と置き換えるかどうかを制御します。
- METH_COEXIST¶
メソッドを既存の定義を置き換える形でロードします。 METH_COEXIST を指定しなければ、デフォルトの設定にしたがって、定義が重複しないようスキップします。スロットラッパーはメソッドテーブルよりも前にロードされるので、例えば sq_contains スロットはラップしているメソッド
__contains__()
を生成し、同名の PyCFunction のロードを阻止します。このフラグを定義すると、 PyCFunction はラッパーオブジェクトを置き換える形でロードされ、スロットと連立します。 PyCFunctions の呼び出しはラッパーオブジェクトの呼び出しよりも最適化されているので、こうした仕様が便利になります。
Accessing attributes of extension types¶
-
type PyMemberDef¶
- Part of the Stable ABI (including all members).
type の C 構造体のメンバとして格納されている、ある型の属性を表す構造体です。この構造体のフィールドは以下のとおりです:
フィールド
C の型
意味
name
const char *
メンバ名
type
int
C 構造体の中のメンバの型
offset
Py_ssize_t
そのメンバの type object 構造体中の場所の offset バイト数
flags
int
フィールドが読み出し専用か書込み可能なのかを示すビットフラグ
doc
const char *
docstring の内容を指すポインタ
type
はたくさんのCの型を意味するT_
マクロのうちの1つです。メンバが Python からアクセスされるとき、そのメンバは対応する Python の型に変換されます。マクロ名
C の型
T_SHORT
short
T_INT
int
T_LONG
long
T_FLOAT
浮動小数点数
T_DOUBLE
double
T_STRING
const char *
T_OBJECT
PyObject *
T_OBJECT_EX
PyObject *
T_CHAR
char
T_BYTE
char
T_UBYTE
unsigned char
T_UINT
unsigned int
T_USHORT
unsigned short
T_ULONG
unsigned long
T_BOOL
char
T_LONGLONG
long long
T_ULONGLONG
unsigned long long
T_PYSSIZET
Py_ssize_t
T_OBJECT
とT_OBJECT_EX
が異なっているのは、T_OBJECT
はメンバがNULL
だったときにNone
を返すのに対し、T_OBJECT_EX
はAttributeError
を送出する点です。T_OBJECT_EX
はT_OBJECT
より属性に対するdel
文を正しくあつかうので、できればT_OBJECT
ではなくT_OBJECT_EX
を使ってください。flags
can be0
for write and read access orREADONLY
for read-only access. UsingT_STRING
fortype
impliesREADONLY
.T_STRING
data is interpreted as UTF-8. OnlyT_OBJECT
andT_OBJECT_EX
members can be deleted. (They are set toNULL
).Heap allocated types (created using
PyType_FromSpec()
or similar),PyMemberDef
may contain definitions for the special members__dictoffset__
,__weaklistoffset__
and__vectorcalloffset__
, corresponding totp_dictoffset
,tp_weaklistoffset
andtp_vectorcall_offset
in type objects. These must be defined withT_PYSSIZET
andREADONLY
, for example:static PyMemberDef spam_type_members[] = { {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY}, {NULL} /* Sentinel */ };
-
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)¶
Get an attribute belonging to the object at address obj_addr. The attribute is described by
PyMemberDef
m. ReturnsNULL
on error.
-
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)¶
Set an attribute belonging to the object at address obj_addr to object o. The attribute to set is described by
PyMemberDef
m. Returns0
if successful and a negative value on failure.
-
type PyGetSetDef¶
- Part of the Stable ABI (including all members).
型のプロパティのようなアクセスを定義するための構造体です。 c:member:PyTypeObject.tp_getset スロットの説明も参照してください。
フィールド
C の型
意味
name
const char *
属性名
get
getter
C function to get the attribute
集合
setter
属性をセット/削除する任意のC言語関数。省略された場合、属性は読み取り専用になります。
doc
const char *
任意のドキュメンテーション文字列
closure
void *
getterとsetterの追加データを提供する、オプションの関数ポインタ。
The
get
function takes one PyObject* parameter (the instance) and a function pointer (the associatedclosure
):typedef PyObject *(*getter)(PyObject *, void *);
It should return a new reference on success or
NULL
with a set exception on failure.set
functions take two PyObject* parameters (the instance and the value to be set) and a function pointer (the associatedclosure
):typedef int (*setter)(PyObject *, PyObject *, void *);
In case the attribute should be deleted the second parameter is
NULL
. Should return0
on success or-1
with a set exception on failure.