如何使用pythoncapi从对象的方法中访问常量?

2024-10-04 13:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有another question的后续报道。这个问题是关于如何访问添加到Python的C扩展模块的常量。你知道吗

为了解释这个问题和答案,如果您在初始化函数中将常量REDBLUE添加到模块中,如下所示:

PyMODINIT_FUNC
PyInit_mymodule(void)
{
    PyObject* module = PyModule_Create(&Module);

    // ...

    PyModule_AddStringConstant(module, "BLUE", "blue");
    PyModule_AddStringConstant(module, "RED", "red");

    return module;
}

然后您可以访问它们,例如从函数返回它们,如下所示(请记住,如果需要,您必须增加引用计数):

// Get module dict. This is a borrowed reference.
PyObject* module_dict = PyModule_GetDict(module);

// Get BLUE constant. This is a borrowed reference.
PyObject* BLUE = PyDict_GetItemString(module_dict, "BLUE");

// Get RED constant. This is a borrowed reference.
PyObject* RED = PyDict_GetItemString(module_dict, "RED");

如果你有一个指向module对象的指针,那就很好了,链接问题就是这样。你知道吗

我的问题是,如果没有指向模块对象的指针,该怎么做?例如,如果当前函数是一个对象的方法,那么您拥有的self指针是针对该对象的,而不是针对模块的(而且我还没有找到从对象获取模块的方法):

static PyObject * Foo_get_color(FooObject *self) {
    // How do I get the module object here?
    PyObject *module_dict = PyModule_GetDict(/* ??? */);

    PyObject *color = NULL;
    if (self->color == RED) {
        color = PyDict_GetItemString(module_dict, "RED");
        Py_INCREF(color);
    } else if (self->color == BLUE) {
        color = PyDict_GetItemString(module_dict, "BLUE");
        Py_INCREF(color);
    }

    return color;
}

Tags: 模块对象函数selfgetblueredthis
1条回答
网友
1楼 · 发布于 2024-10-04 13:20:11

如果您有一个模块定义(struct PyModuleDef),您可以调用PyState_FindModule。我将您的结构命名为Module,如您的示例所示,因此它将如下所示:

PyObject * your_function() {
    PyObject *module = PyState_FindModule(&Module);
    PyObject* module_dict = PyModule_GetDict(module);
    ...
}

FindModule documentation表示需要将模块添加到解释器状态,如下所示:

PyMODINIT_FUNC
PyInit_mymodule(void)
{
    PyObject* module = PyModule_Create(&Module);
    PyState_AddModule(module, &Module);
    ...

相关问题 更多 >