PyVarObject ob_base;
請見上面 PyVarObject
的文件。
int Py_Is(PyObject *x, PyObject *y)
為 穩定 ABI 的一部分 自 3.10 版本開始.测试 x 是否为 y 对象,与 Python 中的 x is y
相同。
Added in version 3.10.
int Py_IsNone(PyObject *x)
為 穩定 ABI 的一部分 自 3.10 版本開始.测试一个对象是否为 None
单例,与 Python 中的 x is None
相同。
Added in version 3.10.
int Py_IsTrue(PyObject *x)
為 穩定 ABI 的一部分 自 3.10 版本開始.测试一个对象是否为 True
单例,与 Python 中的 x is True
相同。
Added in version 3.10.
int Py_IsFalse(PyObject *x)
為 穩定 ABI 的一部分 自 3.10 版本開始.测试一个对象是否为 False
单例,与 Python 中的 x is False
相同。
Added in version 3.10.
int Py_IS_TYPE(PyObject *o, PyTypeObject *type)
如果对象 o 的类型为 type 则返回非零值。 否则返回零。 等价于: Py_TYPE(o) == type
。
Added in version 3.9.
Py_ssize_t Py_SIZE(PyVarObject *o)
取得 Python 物件 o 的大小。
使用 Py_SET_SIZE()
函数来设置一个对象大小。
在 3.11 版的變更: Py_SIZE()
被改为一个内联静态函数。 形参类型不再是 const PyVarObject*。
PyVarObject_HEAD_INIT(type, size)
这是一个为新的 PyVarObject
类型扩展初始化值的宏,包括 ob_size
字段。 该宏会扩展为:
_PyObject_EXTRA_INIT
1, type, size,
type PyCFunction
為 穩定 ABI 的一部分.用于在 C 中实现大多数 Python 可调用对象的函数类型。 该类型的函数接受两个 PyObject* 形参并返回一个这样的值。 如果返回值为 NULL
,则将设置一个异常。 如果不为 NULL
,则返回值将被解读为 Python 中暴露的函数的返回值。 此函数必须返回一个新的引用。
函数的签名为:
PyObject *PyCFunction(PyObject *self,
PyObject *args);
type PyCFunctionWithKeywords
為 穩定 ABI 的一部分.用于在 C 中实现具有 METH_VARARGS | METH_KEYWORDS 签名的 Python 可调用对象的函数类型。 函数的签名为:
PyObject *PyCFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kwargs);
type _PyCFunctionFast
用于在 C 中实现具有 METH_FASTCALL
签名的 Python 可调用对象的函数类型。 函数的签名为:
PyObject *_PyCFunctionFast(PyObject *self,
PyObject *const *args,
Py_ssize_t nargs);
type _PyCFunctionFastWithKeywords
用于在 C 中实现具有 METH_FASTCALL | METH_KEYWORDS 签名的 Python 可调用对象的函数类型。 函数的签名为:
PyObject *_PyCFunctionFastWithKeywords(PyObject *self,
PyObject *const *args,
Py_ssize_t nargs,
PyObject *kwnames);
type PyCMethod
用于在 C 中实现具有 METH_METHOD | METH_FASTCALL | METH_KEYWORDS 签名的 Python 可调用对象的函数类型。 函数的签名为:
PyObject *PyCMethod(PyObject *self,
PyTypeObject *defining_class,
PyObject *const *args,
Py_ssize_t nargs,
PyObject *kwnames)
Added in version 3.9.
ml_meth
是一个 C 函数指针。 该函数可以为不同类型,但它们将总是返回 PyObject*。 如果该函数不属于 PyCFunction
,则编译器将要求在方法表中进行转换。 尽管 PyCFunction
将第一个参数定义为 PyObject*,但该方法的实现使用 self 对象的特定 C 类型也很常见。
ml_flags
字段是可以包含以下旗标的位字段。 每个旗标表示一个调用惯例或绑定惯例。
调用惯例有如下这些:
METH_VARARGS
这是典型的调用惯例,其中方法的类型为 PyCFunction
。 该函数接受两个 PyObject* 值。 第一个是用于方法的 self 对象;对于模块函数,它将为模块对象。 第二个形参 (常被命名为 args) 是一个代表所有参数的元组对象。 该形参通常是使用 PyArg_ParseTuple()
或 PyArg_UnpackTuple()
来处理的。
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).
Added in version 3.7.
在 3.10 版的變更: METH_FASTCALL
现在是 稳定 ABI 的一部分。
METH_FASTCALL | METH_KEYWORDSExtension 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 possibly NULL
if there are no keywords. The values of the keyword
arguments are stored in the args array, after the positional arguments.
Added in version 3.7.
METH_METHOD | METH_FASTCALL | METH_KEYWORDSMETH_FASTCALL | METH_KEYWORDS 的扩展支持 定义式类,也就是包含相应方法的类。 定义式类可以是 Py_TYPE(self)
的超类。
该方法必须为 PyCMethod
类型,与在 self
之后添加了 defining_class
参数的 METH_FASTCALL | METH_KEYWORDS
一样。
Added in version 3.9.
METH_NOARGS
如果通过 METH_NOARGS
旗标列出了参数则没有形参的方法无需检查是否给出了参数。 它们必须为 PyCFunction
类型。 第一个形参通常被命名为 self 并将持有对模块或对象实例的引用。 在所有情况下第二个形参都将为 NULL
。
该函数必须有 2 个形参。 由于第二个形参不会被使用,Py_UNUSED
可以被用来防止编译器警告。
METH_O
具有一个单独对象参数的方法可使用 METH_O
旗标列出,而不必发起调用 PyArg_ParseTuple()
并附带 "O"
参数。 它们的类型为 PyCFunction
,带有 self 形参,以及代表该单独参数的 PyObject* 形参。
这两个常量不是被用来指明调用惯例而是在配合类方法使用时指明绑定。 它们不会被用于在模块上定义的函数。 对于任何给定方法这些旗标最多只会设置其中一个。
METH_CLASS
该方法将接受类型对象而不是类型的实例作为第一个形参。 它会被用于创建 类方法,类似于使用 classmethod()
内置函数所创建的结果。
PyObject *PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)
回傳值:新的參照。 為 穩定 ABI 的一部分 自 3.9 版本開始.将 ml 转为一个 Python callable 对象。 调用方必须确保 ml 的生命期长于 callable。 通常,ml 会被定义为一个静态变量。
self 形参将在发起调用时作为 ml->ml_meth
中 C 函数的 self 参数传入。 self 可以为 NULL
。
callable 对象的 __module__
属性可以根据给定的 module 参数来设置。 module 应为一个 Python 字符串,它将被用作函数定义所在的模块名称。 如果不可用,它将被设为 None
或 NULL
。
function.__module__
cls 形参将被作为 C 函数的 defining_class 参数传入。 如果在 ml->ml_flags
上设置了 METH_METHOD
则必须设置该形参。
Added in version 3.9.
PyObject *PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
回傳值:新的參照。 為 穩定 ABI 的一部分.等價於 PyCMethod_New(ml, self, module, NULL)
。
type PyMemberDef
為 穩定 ABI 的一部分 (包含所有成員).描述某个 C 结构成员对应类型的属性的结构体。 在定义类时,要把由这些结构组成的以 NULL 结尾的数组 放在 tp_members
槽位中。
其中的字段及顺序如下:
const char *name
成员名称。 NULL 值表示 PyMemberDef[]
数组的结束。
字符串应当是静态的,它不会被复制。
默认情况下 (当 flags
为 0
时),成员同时允许读取和写入访问。 使用 Py_READONLY
旗标表示只读访问。 某些类型,如 Py_T_STRING
,隐含要求 Py_READONLY
。 只有 Py_T_OBJECT_EX
(以及旧式的 T_OBJECT
) 成员可以删除。
对于堆分配类型(使用 PyType_FromSpec()
或类似函数创建),PyMemberDef
可能包含特殊成员 "__vectorcalloffset__"
的定义,与类型对象中的 tp_vectorcall_offset
相对应。 它们必须用 Py_T_PYSSIZET
和 Py_READONLY
来定义,例如:
static PyMemberDef spam_type_members[] = {
{"__vectorcalloffset__", Py_T_PYSSIZET,
offsetof(Spam_object, vectorcall), Py_READONLY},
{NULL} /* Sentinel */
(您可能需要为 offsetof()
添加 #include <stddef.h>
。)
旧式的偏移量 tp_dictoffset
和 tp_weaklistoffset
可使用 "__dictoffset__"
和 "__weaklistoffset__"
成员进行类似的定义,但强烈建议扩展程序改用 Py_TPFLAGS_MANAGED_DICT
和 Py_TPFLAGS_MANAGED_WEAKREF
。
在 3.12 版的變更: PyMemberDef
将始终可用。在之前版本中,它需要包括 "structmember.h"
。
PyObject *PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)
為 穩定 ABI 的一部分.获取属于地址Get an attribute belonging to the object at address obj_addr 上的对象的某个属性。 该属性是以 PyMemberDef
m 来描述的。 出错时返回 NULL
。
在 3.12 版的變更: PyMember_GetOne
将总是可用。 在之前版本中,它需要包括 "structmember.h"
。
int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)
為 穩定 ABI 的一部分.将属于位于地址 obj_addr 的对象的属性设置到对象 o。 要设置的属性由 PyMemberDef
m 描述。 成功时返回 0
而失败时返回负值。
在 3.12 版的變更: PyMember_SetOne
将总是可用。 在之前版本中,它需要包括 "structmember.h"
。
Py_RELATIVE_OFFSET
表示该 PyMemberDef
条目的 offset
是指明来自子类专属数据的偏移量,而不是来自 PyObject
的偏移量。
只能在使用负的 basicsize
创建类时被用作 Py_tp_members
槽位
的组成部分。 它在此种情况下是强制要求。
这个旗标只能在 PyType_Slot
中使用。 在类创建期间设置 tp_members
时,Python 会清除它并将 PyMemberDef.offset
设为相对于 PyObject
结构体的偏移量。
在 3.10 版的變更: 通过 #include "structmember.h"
提供的 RESTRICTED
、READ_RESTRICTED
和 WRITE_RESTRICTED
宏已被弃用。 READ_RESTRICTED
和 RESTRICTED
等同于 Py_AUDIT_READ
;WRITE_RESTRICTED
则没有任何作用。
在 3.12 版的變更: READONLY
宏被更名为 Py_READONLY
。 PY_AUDIT_READ
宏被更名为 Py_
前缀。 新名称现在将始终可用。 在之前的版本中,这些名称需要 #include "structmember.h"
。该头文件仍然可用并提供了原有的名称。
成员类型
PyMemberDef.type
可以是下列与各种 C 类型相对应的宏之一。 在 Python 中访问该成员时,它将被转换为对应的 Python 类型。 当从 Python 设置成员时,它将被转换回 C 类型。 如果无法转换,则会引发一个异常如 TypeError
或 ValueError
。
除非标记为 (D),否则不能使用 del
或 delattr()
删除以这种方式定义的属性。
Python 类型
(*): 以零结束的 UTF8 编码的 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
。
type PyGetSetDef
為 穩定 ABI 的一部分 (包含所有成員).用于定义针对某个类型的特征属性式的访问的结构体。 另请参阅 PyTypeObject.tp_getset
槽位的描述。
const char *name
typedef PyObject *(*getter)(PyObject*, void*)
為 穩定 ABI 的一部分.get
函数接受一个 PyObject* 形参 (相应的实例) 和一个用户数据指针 (关联的 closure
):
它应当在成功时返回一个新的引用或在失败时返回 NULL
并设置异常。
typedef int (*setter)(PyObject*, PyObject*, void*)
為 穩定 ABI 的一部分.set
函数接受两个 PyObject* 形参 (相应的实例和要设置的值) 和一个用户数据指针 (关联的 closure
):
对于属性要被删除的情况第二个形参应为 NULL
。 成功时应返回 0
或在失败时返回 -1
并设置异常。
2001-2024, Python Software Foundation.
This page is licensed under the Python Software Foundation License Version 2.
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
See History and License for more information.