我有another question的后续报道。这个问题是关于如何访问添加到Python的C扩展模块的常量。你知道吗
为了解释这个问题和答案,如果您在初始化函数中将常量RED
和BLUE
添加到模块中,如下所示:
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;
}
如果您有一个模块定义(
struct PyModuleDef
),您可以调用PyState_FindModule
。我将您的结构命名为Module
,如您的示例所示,因此它将如下所示:FindModule documentation表示需要将模块添加到解释器状态,如下所示:
相关问题 更多 >
编程相关推荐