Capsule 对象

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

Added in version 3.1.

type PyCapsule

这个 PyObject 的子类型代表一个隐藏的值,适用于需要将隐藏值(作为 void* 指针)通过 Python 代码传递到其他 C 代码的 C 扩展模块。 它常常被用来让在一个模块中定义的 C 函数指针在其他模块中可用,这样就可以使用常规导入机制来访问在动态加载的模块中定义的 C API。

type PyCapsule_Destructor
属于 稳定 ABI.

Capsule 的析构器回调的类型。 定义如下:

typedef void (*PyCapsule_Destructor)(PyObject *);

参阅 PyCapsule_New() 来获取 PyCapsule_Destructor 返回值的语义。

int PyCapsule_CheckExact(PyObject *p)

如果参数是一个 PyCapsule 则返回真值。 此函数总是会成功执行。

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

创建一个封装了 pointerPyCapsulepointer 参考可以不为 NULL

在失败时设置一个异常并返回 NULL

字符串 name 可以是 NULL 或是一个指向有效的 C 字符串的指针。 如果不为 NULL,则此字符串必须比 capsule 长(虽然也允许在 destructor 中释放它。)

如果 destructor 参数不为 NULL,则当它被销毁时将附带 capsule 作为参数来调用。

如果此 capsule 将被保存为一个模块的属性,则 name 应当被指定为 modulename.attributename。 这将允许其他模块使用 PyCapsule_Import() 来导入此 capsule。

void *PyCapsule_GetPointer(PyObject *capsule, const char *name)
属于 稳定 ABI.

提取保存在 capsule 中的 pointer。 在失败时设置一个异常并返回 NULL

name 参数必须与 capsule 中存储的名称完全一致。 如果存储在 capsule 中的名称是 NULL ,传入的 name 也必须是 NULL。 Python 使用 C 函数 strcmp() 来比较 capsule 名称。

PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)
属于 稳定 ABI.

返回保存在 capsule 中的当前析构器。 在失败时设置一个异常并返回 NULL

capsule 具有 NULL 析构器是合法的。 这会使得 NULL 返回码有些歧义;请使用 PyCapsule_IsValid()PyErr_Occurred() 来消除歧义。

void *PyCapsule_GetContext(PyObject *capsule)
属于 稳定 ABI.

返回保存在 capsule 中的当前上下文。 在失败时设置一个异常并返回 NULL

capsule 具有 NULL 上下文是全法的。 这会使得 NULL 返回码有些歧义;请使用 PyCapsule_IsValid()PyErr_Occurred() 来消除歧义。

const char *PyCapsule_GetName(PyObject *capsule)
属于 稳定 ABI.

返回保存在 capsule 中的当前名称。 在失败时设置一个异常并返回 NULL

capsule 具有 NULL 名称是合法的。 这会使得 NULL 返回码有些歧义;请使用 PyCapsule_IsValid()PyErr_Occurred() 来消除歧义。

void *PyCapsule_Import(const char *name, int no_block)
属于 稳定 ABI.

从一个模块内的包装属性导入一个指向 C 对象的指针。 name 形参应当指定该属性的完整名称,就像 module.attribute 这样。 储存在包装中的 name 必须与此字符串完全匹配。

此函数会按 . 字符拆分 name,并导入第一个元素。 随后它会使用属性查找来进行其他元素。

成功时返回 capsule 的内部 指针。 在失败时设置一个异常并返回 NULL

备注

If name points to an attribute of some submodule or subpackage, this submodule or subpackage must be previously imported using other means (for example, by using PyImport_ImportModule()) for the attribute lookups to succeed.

在 3.3 版本发生变更: no_block 不再有任何影响。

int PyCapsule_IsValid(PyObject *capsule, const char *name)
属于 稳定 ABI.

确定 capsule 是否是一个有效的。 有效的 capsule 必须不为 NULL,传递 PyCapsule_CheckExact(),在其中存储一个不为 NULL 的指针,并且其内部名称与 name 形参相匹配。 (请参阅 PyCapsule_GetPointer() 了解如何对 capsule 名称进行比较的有关信息。)

换句话说,如果 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,则名称的存在期必须比 capsule 更长。 如果之前保存在 capsule 中的 name 不为 NULL,则不会尝试释放它。

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

int PyCapsule_SetPointer(PyObject *capsule, void *pointer)
属于 稳定 ABI.

capsule 内部的空指针设为 pointer。 指针不可为 NULL

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