2012-05-09 15 views
10

Si estoy entendiendo correctamente,Diferencia entre PyMODINIT_FUNC y PyModule_Create

  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 MUST retorno del 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); 
    } 
    

lo tanto, mi cordura preguntas de revisión son:

  • es mi entendimiento correcto?
  • ¿Por qué se realizó este cambio?

En este momento, solo estoy experimentando con casos muy simples de C-extensions of Python. Tal vez si yo estuviera haciendo más, la respuesta a esto sería obvio, o tal vez si se trata de incrustar Python en otra cosa ....

Respuesta

4
  1. Sí, su comprensión es correcta. Debe devolver el nuevo objeto de módulo desde la función de entrada con el tipo de retorno PyMODINIT_FUNC. (PyMODINIT_FUNC declara la función para devolver void en python2, y para devolver PyObject * en python3.)

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