2012-05-09 21 views
10

Wenn ich richtig verstehen,Unterschied zwischen PyMODINIT_FUNC und PyModule_Create

  1. PyMODINIT_FUNC in Python 2.x wurde von PyModule_Create in Python3.X
  2. Beide geben PyObject* jedoch in Python 3 ersetzt. X, die Initialisierungsfunktion MUST Rückkehr des Moduls die PyObject* zum Modul - dh

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

    während in Python2.x, ist dies nicht notwendig - das heißt

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

Also, meine geistige Gesundheit Überprüfung Fragen sind:

  • Ist mein Verständnis richtig?
  • Warum wurde diese Änderung vorgenommen?

Im Moment experimentiere ich nur mit sehr einfachen Fällen von C-Erweiterungen von Python. Vielleicht, wenn ich mehr tun würde, wäre die Antwort auf diesen offensichtlich, oder vielleicht, wenn ich versuche anderen Python in etwas einzuzubetten ....

Antwort

4
  1. Ja, Ihr Verständnis korrekt ist. Sie müssen das neue Modulobjekt von der Initing-Funktion mit dem Rückgabetyp PyMODINIT_FUNC zurückgeben. (PyMODINIT_FUNC deklariert die Funktion, um void in python2 zurückzugeben und pyObject * in python3 zurückzugeben.) Ich kann nur über die Motivationen der Leute spekulieren, die die Änderung gemacht haben, aber ich glaube, es war so, dass Fehler in Das Importieren des Moduls könnte leichter identifiziert werden (Sie können NULL von der Funktion module-init in python3 zurückgeben, wenn etwas schief gelaufen ist).