Capsules

有关使用这些对象的更多信息,请参阅 为扩展模块提供 C API

在 3.1 版本加入。

类型 PyCapsule

PyObject 子类型表示一个不透明值,对于需要通过 Python 代码将不透明值(作为 void* 指针)传递给其他 C 代码的 C 扩展模块非常有用。它通常用于将一个模块中定义的 C 函数指针提供给其他模块,以便可以使用常规的导入机制来访问动态加载模块中定义的 C API。

类型 PyCapsule_Destructor
作为 稳定 ABI 的一部分。

胶囊的析构函数回调类型。定义为

typedef void (*PyCapsule_Destructor)(PyObject *);

有关 PyCapsule_Destructor 回调的语义,请参阅 PyCapsule_New()

int PyCapsule_CheckExact(PyObject *p)

如果其参数是 PyCapsule,则返回 true。此函数始终成功。

PyObject *PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
返回值: 新引用。 稳定ABI 的一部分。

创建一个封装 pointerPyCapsulepointer 参数不能为 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 必须与此字符串完全匹配。

此函数在 . 字符处拆分 name,并导入第一个元素。然后它使用属性查找处理后续元素。

成功时返回胶囊的内部 pointer。失败时,设置异常并返回 NULL

备注

如果 name 指向某个子模块或子包的属性,则必须通过其他方式(例如,使用 PyImport_ImportModule())预先导入此子模块或子包,才能成功进行属性查找。

版本 3.3 中已更改: no_block 不再有任何作用。

int PyCapsule_IsValid(PyObject *capsule, const char *name)
作为 稳定 ABI 的一部分。

确定 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。失败时返回非零并设置异常。

int PyCapsule_SetName(PyObject *capsule, const char *name)
作为 稳定 ABI 的一部分。

capsule 内部的名称设置为 name。如果非 NULL,则名称的生命周期必须长于胶囊。如果胶囊中存储的先前 name 不是 NULL,则不会尝试释放它。

成功时返回 0。失败时返回非零并设置异常。

int PyCapsule_SetPointer(PyObject *capsule, void *pointer)
作为 稳定 ABI 的一部分。

capsule 内部的 void 指针设置为 pointer。指针不能为 NULL

成功时返回 0。失败时返回非零并设置异常。