首先,模块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
value,首先再次获取它所在的模块:
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
}
Now, align_instance
包含IntEnum
要返回的实例。务必Py_DECREF(align_enum)
返回之前。