LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 450|回复: 0

支持函数

[复制链接]
发表于 2024-2-4 01:39:57 | 显示全部楼层 |阅读模式


模块初始化函数(单阶段初始化)或通过模块的执行槽位调用的函数(多阶段初始化),可以使用以下函数,来帮助初始化模块的状态:

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 版本加入.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表