Разница между PyMODINIT_FUNC и PyModule_Create
Если я правильно понимаю,
- PyMODINIT_FUNC в Python 2.X заменен на
PyModule_Create
в Python3.X
-
Оба возвращают PyObject*
, однако в Python 3.X функция инициализации модуля MUST возвращает PyObject*
в модуль - i.e.
PyMODINIT_FUNC
PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
тогда как в Python2.X это не обязательно - то есть
PyMODINIT_FUNC
initspam(void)
{
(void) Py_InitModule("spam", SpamMethods);
}
Итак, мои вопросы проверки работоспособности:
- Правильно ли я понимаю?
- Почему было сделано это изменение?
Сейчас я просто экспериментирую с очень простыми случаями C-расширений Python. Возможно, если бы я делал больше, ответ на это был бы очевиден, или, может быть, если бы я пытался внедрить Python во что-то еще...
Ответы
Ответ 1
-
Да, ваше понимание правильное. Вы должны вернуть новый объект модуля из функции initing с возвращаемым типом PyMODINIT_FUNC. (PyMODINIT_FUNC объявляет функцию для возврата void в python2 и возвращает PyObject * в python3.)
-
Я могу только размышлять о мотивации людей, внесших изменения, но я считаю, что ошибки в импорте модуля можно было бы легче идентифицировать (вы можете вернуть NULL из функции init-модуля в python3, если что-то пошло не так).