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 返回值的语义。
-
PyObject *PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)¶
- 返回值:新的引用。 属于 稳定 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 名称。
-
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
。 失败时返回非零值并设置一个异常。