胶囊¶
请参阅 为扩展模块提供 C API 以获取有关使用这些对象的更多信息。
3.1 版本中新增。
-
type PyCapsule¶
此
PyObject
的子类型表示一个不透明的值,对于需要通过 Python 代码将不透明值(作为 void* 指针)传递给其他 C 代码的 C 扩展模块非常有用。它通常用于使一个模块中定义的 C 函数指针可用于其他模块,因此可以使用常规的导入机制来访问动态加载模块中定义的 C API。
-
type PyCapsule_Destructor¶
- 稳定 ABI 的一部分。
胶囊的析构函数回调的类型。定义为
typedef void (*PyCapsule_Destructor)(PyObject *);
有关 PyCapsule_Destructor 回调的语义,请参阅
PyCapsule_New()
。
-
PyObject *PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)¶
- 返回值:新引用。 稳定 ABI 的一部分。
创建一个封装 pointer 的
PyCapsule
。pointer 参数不能为NULL
。如果失败,则设置一个异常并返回
NULL
。name 字符串可以为
NULL
或指向有效 C 字符串的指针。如果非NULL
,则此字符串必须在胶囊的生命周期内有效。(尽管允许在 destructor 中释放它。)如果 destructor 参数不是
NULL
,则会在销毁时使用胶囊作为其参数调用它。如果此胶囊将存储为模块的属性,则 name 应指定为
modulename.attributename
。这将使其他模块可以使用PyCapsule_Import()
导入胶囊。
-
void *PyCapsule_GetPointer(PyObject *capsule, const char *name)¶
- 稳定 ABI 的一部分。
检索存储在胶囊中的 pointer。如果失败,则设置一个异常并返回
NULL
。name 参数必须与存储在胶囊中的名称完全匹配。如果存储在胶囊中的名称是
NULL
,则传入的 name 也必须是NULL
。Python 使用 C 函数strcmp()
比较胶囊名称。
-
PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)¶
- 稳定 ABI 的一部分。
返回当前存储在胶囊中的析构函数。如果失败,则设置一个异常并返回
NULL
。胶囊具有
NULL
析构函数是合法的。这使得NULL
返回代码有些模棱两可;使用PyCapsule_IsValid()
或PyErr_Occurred()
来消除歧义。
-
void *PyCapsule_GetContext(PyObject *capsule)¶
- 稳定 ABI 的一部分。
返回当前存储在胶囊中的上下文。如果失败,则设置一个异常并返回
NULL
。胶囊具有
NULL
上下文是合法的。这使得NULL
返回代码有些模棱两可;使用PyCapsule_IsValid()
或PyErr_Occurred()
来消除歧义。
-
const char *PyCapsule_GetName(PyObject *capsule)¶
- 稳定 ABI 的一部分。
返回当前存储在胶囊中的名称。如果失败,则设置一个异常并返回
NULL
。胶囊具有
NULL
名称是合法的。这使得NULL
返回代码有些模棱两可;使用PyCapsule_IsValid()
或PyErr_Occurred()
来消除歧义。
-
void *PyCapsule_Import(const char *name, int no_block)¶
- 稳定 ABI 的一部分。
从模块中的胶囊属性导入指向 C 对象的指针。name 参数应指定属性的完整名称,如
module.attribute
。存储在胶囊中的 name 必须与此字符串完全匹配。成功时返回胶囊的内部 pointer。如果失败,则设置一个异常并返回
NULL
。在 3.3 版本中更改:no_block 不再起作用。
-
int PyCapsule_IsValid(PyObject *capsule, const char *name)¶
- 稳定 ABI 的一部分。
确定 capsule 是否为有效的胶囊 (capsule)。有效的胶囊是非
NULL
,通过PyCapsule_CheckExact()
检查,内部存储了非NULL
指针,并且其内部名称与 name 参数匹配。(有关胶囊名称如何比较的信息,请参阅PyCapsule_GetPointer()
。)换句话说,如果
PyCapsule_IsValid()
返回真值,则保证对任何访问器(任何以PyCapsule_Get
开头的函数)的调用都会成功。如果对象有效且与传入的名称匹配,则返回非零值。否则返回
0
。此函数不会失败。
-
int PyCapsule_SetContext(PyObject *capsule, void *context)¶
- 稳定 ABI 的一部分。
将 capsule 内部的上下文指针设置为 context。
成功时返回
0
。失败时返回非零值并设置异常。
-
int PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor)¶
- 稳定 ABI 的一部分。
将 capsule 内部的析构函数设置为 destructor。
成功时返回
0
。失败时返回非零值并设置异常。