模块初始化函数(单阶段初始化)或通过模块的执行槽位调用的函数(多阶段初始化),可以使用以下函数,来帮助初始化模块的状态:
int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)
属于 稳定 ABI 自 3.10 版开始.
将一个名称为*name*的对象添加到*module*模块中。这是一个方便的函数,可以在模块的初始化函数中使用。
如果成功,返回 0。如果发生错误,引发异常并返回 -1。
如果*value*为 NULL,返回 NULL。在调用它时发生这种情况,必须抛出异常。
用法示例:
static int
add_spam(PyObject *module, int value)
{
PyObject *obj = PyLong_FromLong(value);
if (obj == NULL) {
return -1;
}
int res = PyModule_AddObjectRef(module, "spam", obj);
Py_DECREF(obj);
return res;
}
这个例子也可以写成不显式地检查 obj 是否为 NULL:
static int
add_spam(PyObject *module, int value)
{
PyObject *obj = PyLong_FromLong(value);
int res = PyModule_AddObjectRef(module, "spam", obj);
Py_XDECREF(obj);
return res;
}
注意在此情况下应当使用 Py_XDECREF() 而不是 Py_DECREF(),因为 obj 可能为 NULL。
在 3.10 版本加入.
int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)
属于 稳定 ABI.
类似于 PyModule_AddObjectRef(),但会在成功时偷取一个对 value 的引用(如果它返回 0 值)。
推荐使用新的 PyModule_AddObjectRef() 函数,因为误用 PyModule_AddObject() 函数很容易导致引用泄漏。
备注 与其他窃取引用的函数不同,PyModule_AddObject() 只在 成功 时释放对 value 的引用。
这意味着必须检查它的返回值,调用方必须在发生错误时手动为*value*调用 Py_DECREF()。
用法示例:
static int
add_spam(PyObject *module, int value)
{
PyObject *obj = PyLong_FromLong(value);
if (obj == NULL) {
return -1;
}
if (PyModule_AddObject(module, "spam", obj) < 0) {
Py_DECREF(obj);
return -1;
}
// PyModule_AddObject() stole a reference to obj:
// Py_DECREF(obj) is not needed here
return 0;
}
这个例子也可以写成不显式地检查 obj 是否为 NULL:
static int
add_spam(PyObject *module, int value)
{
PyObject *obj = PyLong_FromLong(value);
if (PyModule_AddObject(module, "spam", obj) < 0) {
Py_XDECREF(obj);
return -1;
}
// PyModule_AddObject() stole a reference to obj:
// Py_DECREF(obj) is not needed here
return 0;
}
注意在此情况下应当使用 Py_XDECREF() 而不是 Py_DECREF(),因为 obj 可能为 NULL。
int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
属于 稳定 ABI.
将一个名称为*name*的整型常量添加到*module*模块中。这个方便的函数可以在模块的初始化函数中使用。如果发生错误,返回 -1,成功返回 0。
int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)
属于 稳定 ABI.
将一个名称为*name*的字符串常量添加到*module*模块中。这个方便的函数可以在模块的初始化函数中使用。字符串*value*必须以 NULL 结尾。如果发生错误,返回 -1 ,成功返回 0 。
PyModule_AddIntMacro(module, macro)
将一个整型常量添加到*module*模块中。名称和值取自*macro*参数。例如, PyModule_AddIntMacro(module, AF_INET) 将值为*AF_INET*的整型常量*AF_INET*添加到*module*模块中。如果发生错误,返回 -1 ,成功返回 0 。
PyModule_AddStringMacro(module, macro)
将一个字符串常量添加到*module*模块中。
int PyModule_AddType(PyObject *module, PyTypeObject *type)
属于 稳定 ABI 自 3.10 版开始.
将一个类型对象添加到 module 模块中。类型对象通过在函数内部调用 PyType_Ready() 完成初始化。类型对象的名称取自 tp_name 最后一个点号之后的部分。如果发生错误,返回 -1,成功返回 0。
在 3.9 版本加入. |