Разница между PyMODINIT_FUNC и PyModule_Create

Если я правильно понимаю,

  1. PyMODINIT_FUNC в Python 2.X был заменен на PyModule_Create в Python3.X
  2. Оба возвращают PyObject* , однако, в Python 3.X, функция инициализации модуля ДОЛЖНА вернуть PyObject* в модуль, т. PyObject*

     PyMODINIT_FUNC PyInit_spam(void) { return PyModule_Create(&spammodule); } 

    тогда как в Python2.X это не нужно – т.е.

     PyMODINIT_FUNC initspam(void) { (void) Py_InitModule("spam", SpamMethods); } 

Итак, мои вопросы проверки работоспособности:

  • Правильно ли я понимаю?
  • Почему это было сделано?

Прямо сейчас, я только экспериментирую с очень простыми случаями C-расширений Python. Возможно, если бы я делал больше, ответ на это был бы очевиден, или, может быть, если бы я пытался внедрить Python во что-то еще …

One Solution collect form web for “Разница между PyMODINIT_FUNC и PyModule_Create”

  1. Да, ваше понимание правильное. Вы должны вернуть новый объект модуля из функции initing с возвращаемым типом PyMODINIT_FUNC. (PyMODINIT_FUNC объявляет функцию для возврата void в python2 и возвращает PyObject * в python3.)

  2. Я могу только рассуждать о мотивации людей, внесших изменения, но я считаю, что ошибки в импорте модуля можно было бы легче идентифицировать (вы можете вернуть NULL из функции init-модуля в python3, если что-то пошло не так ).

  • Реализация nb_inplace_add приводит к возврату объекта буфера только для чтения
  • easy_install терпит неудачу при ошибке «Не удалось найти скрипт установки» после бинарной загрузки?
  • Функциональность autodoc Sphinx для Python-C-Extension
  • C массив для PyArray
  • AssertionError (только 3.X) при вызове Py_Finalize с потоками
  • Расширение Python C - Почему методы, которые используют аргументы ключевых слов, передаваемые в PyCFunction
  • расширение python c, проблемы с dlopen на mac os
  • Создание lxml для Python 2.7 на Windows
  • Python - лучший язык программирования в мире.