胶囊¶
有关使用这些对象的更多信息请参阅 给扩展模块提供C API。
3.1 新版功能.
- 
PyCapsule¶
- 这个 - PyObject的子类型代表着一个任意值,当需要通过 Python 代码将任意值(以- void*指针的形式)从 C 扩展模块传递给其他 C 代码时非常有用。它通常用于将指向一个模块中定义的 C 语言函数指针传递给其他模块,以便可以从那里调用它们。这允许通过正常的模块导入机制访问动态加载的模块中的 C API。
- 
PyCapsule_Destructor¶
- 这种类型的一个析构器返回一个胶囊,定义如下: - typedef void (*PyCapsule_Destructor)(PyObject *); - 参阅 - PyCapsule_New()来获取 PyCapsule_Destructor 返回值的语义。
- 
PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)¶
- Return value: New reference.创建一个封装了 pointer 的 PyCapsule。 pointer 参考可以不为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)¶
- 提取保存在 capsule 中的 pointer。 在失败时设置一个异常并返回 - NULL。- name 形参必须与保存在 capsule 中的名称进行精确比较。 如果保存在 capsule 中的名称为 - NULL,则传入的 name 也必须为- NULL。 Python 会使用 C 函数- strcmp()来比较 capsule 名称。
- 
PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)¶
- 返回保存为 capsule 中的当前析构器。 在失败时设置一个异常并返回 - NULL。- 具有 - NULL析构器是合法的。 这会使得- NULL返回值有些歧义;请使用- PyCapsule_IsValid()或- PyErr_Occurred()来消除歧义。
- 
void* PyCapsule_GetContext(PyObject *capsule)¶
- 返回保存在 capsule 中的当前上下文。 在失败时设置一个异常并返回 - NULL。- capsule 具有 - NULL上下文是全法的。 这会使得- NULL返回码有些歧义;请使用- PyCapsule_IsValid()或- PyErr_Occurred()来消除歧义。
- 
const char* PyCapsule_GetName(PyObject *capsule)¶
- 返回保存在 capsule 中的当前名称。 在失败时设置一个异常并返回 - NULL。- capsule 具有 - NULL名称是合法的。 这会使得- NULL返回码有些歧义;请使用- PyCapsule_IsValid()或- PyErr_Occurred()来消除歧义。
- 
void* PyCapsule_Import(const char *name, int no_block)¶
- 从一个模块的 capsule 属性导入指向 C 对象的指针。 name 形参应当指定属性的完整名称,与 - module.attribute中的一致。 保存在 capsule 中的 name 必须完全匹配此字符串。 如果 no_block 为真值,则以无阻塞模式导入模块 (使用- PyImport_ImportModuleNoBlock())。 如果 no_block 为假值,则以传统模式导入模块 (使用- PyImport_ImportModule())。- 成功时返回 capsule 的内部 指针。 在失败时设置一个异常并返回 - NULL。
- 
int PyCapsule_IsValid(PyObject *capsule, const char *name)¶
- 确定 capsule 是否是一个有效的。 有效的 capsule 必须不为 - NULL,传递- PyCapsule_CheckExact(),在其中存储一个不为- NULL的指针,并且其内部名称与 name 形参相匹配。 (请参阅- PyCapsule_GetPointer()了解如何对 capsule 名称进行比较的有关信息。)- 换句话说,如果 - PyCapsule_IsValid()返回真值,则任何对访问器(以- PyCapsule_Get()开头的任何函数)的调用都保证会成功。- 如果对象有效并且匹配传入的名称则返回非零值。 否则返回 - 0。 此函数一定不会失败。
- 
int PyCapsule_SetContext(PyObject *capsule, void *context)¶
- 将 capsule 内部的上下文指针设为 context。 - 成功时返回 - 0。 失败时返回非零值并设置一个异常。
- 
int PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor)¶
- 将 capsule 内部的析构器设为 destructor。 - 成功时返回 - 0。 失败时返回非零值并设置一个异常。
