Diferencia entre PyMODINIT_FUNC y PyModule_Create

Si estoy entendiendo correctamente,

  1. PyMODINIT_FUNC en Python 2.X ha sido reemplazado por PyModule_Create en Python3.X
  2. Ambos devuelven PyObject* , sin embargo, en Python 3.X, la función de inicialización del módulo DEBE devolver el PyObject* al módulo, es decir,

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

    mientras que en Python2.X, esto no es necesario, es decir

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

Por lo tanto, mis preguntas de comprobación de cordura son:

  • ¿Mi entendimiento es correcto?
  • ¿Por qué se hizo este cambio?

En este momento, solo estoy experimentando con casos muy simples de extensiones C de Python. Quizás si estuviera haciendo más, la respuesta a esto sería obvia, o tal vez si estuviera tratando de incrustar Python en otra cosa …

  1. Sí, tu entendimiento es correcto. Debe devolver el nuevo objeto de módulo de la función de inicio con el tipo de retorno PyMODINIT_FUNC. (PyMODINIT_FUNC declara que la función devuelve void en python2, y que devuelve PyObject * en python3.)

  2. Solo puedo especular sobre las motivaciones de las personas que hicieron el cambio, pero creo que fue así para que los errores en la importación del módulo se puedan identificar más fácilmente (puede devolver NULL desde la función de módulo-init en python3 si algo salió mal. ).