Прежде всего, модуль с IntEnum
необходимо импортировать в модуль расширения (если вы этого еще не сделали). В функции инициализации модуля:
PyMODINIT_FUNC PyInit_someextension(void)
{
// ...
PyObject *m;
m = PyModule_Create(&someextension_module);
if (m == NULL) {
return NULL;
}
// ...
// Import the enums module, where "somepackage.enums"
// is the full name of the enums module
PyObject *enums = PyImport_ImportModule("somepackage.enums");
if (enums == NULL) {
Py_DECREF(m);
return NULL;
}
Py_DECREF(enums);
return m;
}
Затем, где вы хотите создать экземпляр значения IntEnum
, сначала извлеките модуль, в котором он находится снова:
PyObject *enums = PyImport_AddModule("somepackage.enums");
if (enums == NULL) {
// Return NULL, -1, etc. to signal an exception
}
Сразу после извлечения вашего IntEnum
type (Align
в данном случае) из модуля:
PyObject *align_enum = PyObject_GetAttrString(enums, "Align");
if (align_enum == NULL) {
// Return NULL, -1, etc. to signal an exception
}
Затем вы можете создать нужный вам экземпляр. align
здесь будет значение для извлечения из IntEnum
. Мы делаем это, вызывая объект типа, как в обычном Python (обратите внимание, что PyObject_CallFunction
на самом деле не ограничивается вызовом функций - он может вызывать любой вызываемый объект):
PyObject *align_instance = PyObject_CallFunction(align_enum, "(i)", align);
if (align_instance == NULL) {
Py_DECREF(align_enum);
// Return NULL, -1, etc. to signal an exception
}
Теперь align_instance
содержит экземпляр IntEnum
для возврата. Обязательно Py_DECREF(align_enum)
перед возвращением.