2012-05-09 12 views
10

Se ho la comprensione correttamente,Differenza tra PyMODINIT_FUNC e PyModule_Create

  1. PyMODINIT_FUNC in Python 2.X è stato sostituito da PyModule_Create in Python3.X
  2. Entrambi restituiscono PyObject*, tuttavia, in Python 3. X, funzione di inizializzazione del modulo MUST ritorno PyObject* al modulo - vale a dire

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

    mentre in python2.X, questo non è necessario - vale a dire

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

Quindi, la mia sanità mentale domande di controllo sono:

  • è la mia comprensione corretta?
  • Perché è stata apportata questa modifica?

Al momento, sto solo sperimentando casi molto semplici di estensioni C di Python. Forse, se fossi fare di più, la risposta a questo sarebbe ovvio, o forse se stessi cercando di incorporare Python in qualcosa d'altro ....

risposta

4
  1. Sì, la vostra comprensione è corretta. È necessario restituire il nuovo oggetto modulo dalla funzione inita con il tipo restituito PyMODINIT_FUNC. (PyMODINIT_FUNC dichiara la funzione restituire void in python2 e restituire PyObject * in python3)

  2. Posso solo speculare sulle motivazioni delle persone che hanno apportato il cambiamento, ma credo che fosse così che gli errori in l'importazione del modulo potrebbe essere più facilmente identificata (puoi restituire NULL dalla funzione module-init in python3 se qualcosa è andato storto).