2012-05-09 3 views
10

Если я правильно понять,разница между PyMODINIT_FUNC и PyModule_Create

  1. PyMODINIT_FUNC в Python 2.x была заменена PyModule_Create в Python3.X
  2. Оба возвращают PyObject*, однако, в Python 3. X, функция инициализации модуля MUST возвращают PyObject* к модулю - т.е.

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

    , тогда как в Python2.X, это не обязательно - т.е.

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

Итак, мой здравомыслие проверка вопросы:

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

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

ответ

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

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