Разница между 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, если что-то пошло не так).