Capsule 对象

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

Added in version 3.1.

  • type PyCapsule
  • 这个 PyObject 的子类型代表一个隐藏的值,适用于需要将隐藏值(作为 void* 指针)通过 Python 代码传递到其他 C 代码的 C 扩展模块。 它常常被用来让在一个模块中定义的 C 函数指针在其他模块中可用,这样就可以使用常规导入机制来访问在动态加载的模块中定义的 C API。
  • type PyCapsule_Destructor
  • 属于 稳定 ABI. Capsule 的析构器回调的类型。 定义如下:
  1. typedef void (*PyCapsule_Destructor)(PyObject *);

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

  • 如果参数是一个 PyCapsule 则返回真值。 此函数总是会成功执行。
  • 返回值:新的引用。 属于 稳定 ABI. 创建一个封装了 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)
  • 属于 稳定 ABI. 提取保存在 capsule 中的 pointer。 在失败时设置一个异常并返回 NULL

name 参数必须与 capsule 中存储的名称完全一致。 如果存储在 capsule 中的名称是 NULL ,传入的 name 也必须是 NULL。 Python 使用 C 函数 strcmp() 来比较 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 必须与此字符串完全匹配。

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

在 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。 失败时返回非零值并设置一个异常。

  • 属于 稳定 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。 失败时返回非零值并设置一个异常。