共通のオブジェクト構造体 (common object structure)¶
Python では、オブジェクト型を定義する上で数多くの構造体が使われます。この節では三つの構造体とその利用方法について説明します。
Base object types and macros¶
全ての Python オブジェクトは、オブジェクトのメモリ内表現の先頭部分にある少数のフィールドを完全に共有しています。
このフィールドは PyObject
型および PyVarObject
型で表現されます。
これらの型もまた、他の全ての Python オブジェクトの定義で直接または間接的に使われているマクロを使って定義されています。
-
PyObject
¶ 全てのオブジェクト型はこの型を拡張したものです。 この型には、あるオブジェクトを指すポインタをオブジェクトとして Python から扱うのに必要な情報が入っています。 通常の "リリース" ビルドでは、この構造体にはオブジェクトの参照カウントとオブジェクトに対応する型オブジェクトだけが入っています。 実際には
PyObject
であることは宣言されていませんが、全ての Python オブジェクトへのポインタはPyObject*
へキャストできます。 メンバにアクセスするにはPy_REFCNT
マクロとPy_TYPE
マクロを使わなければなりません。
-
PyVarObject
¶ 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
のドキュメントを参照してください。
-
Py_TYPE
(o)¶ Python オブジェクトの
ob_type
メンバにアクセスするのに使うマクロです。 これは次のように展開されます:(((PyObject*)(o))->ob_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_REFCNT
(o)¶ Python オブジェクトの
ob_refcnt
メンバにアクセスするのに使うマクロです。 これは次のように展開されます:(((PyObject*)(o))->ob_refcnt)
-
void
Py_SET_REFCNT
(PyObject *o, Py_ssize_t refcnt)¶ オブジェクト o の参照カウントを refcnt に設定します。
バージョン 3.9 で追加.
-
Py_SIZE
(o)¶ Python オブジェクトの
ob_size
メンバにアクセスするのに使うマクロです。 これは次のように展開されます:(((PyVarObject*)(o))->ob_size)
-
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¶
-
PyCFunction
¶ 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 isNULL
, 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);
-
PyCFunctionWithKeywords
¶ 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);
-
_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);
-
_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);
-
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 で追加.
-
PyMethodDef
¶ 拡張型のメソッドを記述する際に用いる構造体です。この構造体には 4 つのフィールドがあります:
フィールド
C の型
意味
ml_name
const char *
メソッド名
ml_meth
PyCFunction
C 実装へのポインタ
ml_flags
int
呼び出しをどのように行うかを示すフラグビット
ml_doc
const char *
docstring の内容を指すポインタ
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 twoPyObject*
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 ofPyObject*
values indicating the arguments and the third parameter is the number of arguments (the length of the array).This is not part of the limited API.
バージョン 3.7 で追加.
-
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 fourthPyObject*
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.This is not part of the limited API.
バージョン 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
になります。
-
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 aPyObject*
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¶
-
PyMemberDef
¶ 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.
-
PyGetSetDef
¶ 型のプロパティのようなアクセスを定義するための構造体です。 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 onePyObject*
parameter (the instance) and a function pointer (the associatedclosure
):typedef PyObject *(*getter)(PyObject *, void *);
成功または失敗時に
NULL
と例外の集合にされたときは新しい参照を返します。set
functions take twoPyObject*
parameters (the instance and the value to be set) and a function pointer (the associatedclosure
):typedef int (*setter)(PyObject *, PyObject *, void *);
属性を削除する場合は、2 番目のパラメータに
NULL
を指定します。成功した場合は0
を、失敗した場合は-1
を例外として返します。