共通のオブジェクト構造体 (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.)
全てのオブジェクト型はこの型を拡張したものです。 この型には、あるオブジェクトを指すポインタをオブジェクトとして Python から扱うのに必要な情報が入っています。 通常の "リリース" ビルドでは、この構造体にはオブジェクトの参照カウントとオブジェクトに対応する型オブジェクトだけが入っています。 実際には
PyObject
であることは宣言されていませんが、全ての Python オブジェクトへのポインタはPyObject*
へキャストできます。 メンバにアクセスするにはPy_REFCNT
マクロとPy_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
(const PyObject *x, const 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
(const 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
(const 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
(const 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
(const 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
(const PyObject *o)¶ Python オブジェクト o の参照カウントを取得します。
バージョン 3.10 で変更:
Py_REFCNT()
is changed to the inline static function. UsePy_SET_REFCNT()
to set an object reference count.
-
void
Py_SET_REFCNT
(PyObject *o, Py_ssize_t refcnt)¶ オブジェクト o の参照カウントを refcnt に設定します。
バージョン 3.9 で追加.
-
Py_ssize_t
Py_SIZE
(const PyVarObject *o)¶ Get the size of the Python object o.
Use the
Py_SET_SIZE()
function to set an object 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¶
-
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 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);
-
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_meth
は C の関数ポインタです。関数は別の型で定義されていてもかまいませんが、常に PyObject*
を返します。関数が PyFunction
でない場合、メソッドテーブル内でキャストを行うようコンパイラが要求することになるでしょう。 PyCFunction
では最初のパラメタが PyObject*
型であると定義していますが、固有の C 型を self オブジェクトに使う実装はよく行われています。
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
¶ PyCFunction
型のメソッドで典型的に使われる呼び出し規約です。関数はPyObject*
型の引数値を二つ要求します。最初の引数はメソッドの self オブジェクトです; モジュール関数の場合、これはモジュールオブジェクトです。第二のパラメタ (よく args と呼ばれます) は、全ての引数を表現するタプルオブジェクトです。パラメタは通常、PyArg_ParseTuple()
やPyArg_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).バージョン 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 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.バージョン 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
¶ 単一のオブジェクト引数だけをとるメソッドは、
PyArg_ParseTuple()
を引数"O"
にして呼び出す代わりに、METH_O
フラグつきで指定できます。メソッドはPyCFunction
型で、 self パラメタと単一の引数を表現するPyObject*
パラメタを伴います。
以下の二つの定数は、呼び出し規約を示すものではなく、クラスのメソッドとして使う際の束縛方式を示すものです。モジュールに対して定義された関数で用いてはなりません。メソッドに対しては、最大で一つしかこのフラグをセットできません。
-
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).
型のプロパティのようなアクセスを定義するための構造体です。
PyTypeObject.tp_getset
スロットの説明も参照してください。フィールド
C の型
意味
name
const char *
属性名
get
getter
C function to get the attribute
集合
setter
属性をセット/削除する任意のC言語関数。省略された場合、属性は読み取り専用になります。
doc
const char *
任意のドキュメンテーション文字列
closure
void *
getterとsetterの追加データを提供する、オプションの関数ポインタ。
get
関数はPyObject*
パラメータ (インスタンス) と関数ポインタ (関連する``closure``) を1つ受け取ります。typedef PyObject *(*getter)(PyObject *, void *);
成功または失敗時に
NULL
と例外の集合にされたときは新しい参照を返します。set
関数はPyObject*
パラメータ (インスタンスとセットされるべき値) と関数ポインタ (関連する``closure``) を受け取ります。typedef int (*setter)(PyObject *, PyObject *, void *);
属性を削除する場合は、2 番目のパラメータに
NULL
を指定します。成功した場合は0
を、失敗した場合は-1
を例外として返します。