У меня есть продолжение для другого вопроса .Этот вопрос о том, как получить доступ к константам, добавленным в модуль расширения C. Для Python.
Перефразировать этот вопрос и ответить, если вы добавили константы 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");
Тоотлично работает, если у вас есть указатель на объект модуля, который имел место в связанном вопросе.
Мой вопрос, как вам это сделать, если у вас нет указателяк объекту модуля?Например, если текущая функция является методом объекта, у вас есть указатель 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;
}