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

  • Передача функции C в функцию Python
  • Нормально ли, что запуск python под valgrind показывает много ошибок с памятью?
  • Сельдерей: правильный способ запуска длительной функции инициализации (за каждый процесс)
  • Реализация nb_inplace_add приводит к возврату объекта буфера только для чтения
  • Расширение Python C: используйте расширение PYD или DLL?
  • Вернуть каталоги библиотек include и runtime из Python
  • Как сделать копию модуля python во время выполнения?
  • AssertionError (только 3.X) при вызове Py_Finalize с потоками
  • Как работает PyArg_ParseTupleAndKeywords?
  • Является ли API-интерфейс python полностью совместимым с C ++?
  • Модуль расширения Python с переменным числом аргументов
  • Python - лучший язык программирования в мире.