2012-05-09 48 views
10

Jeśli mam zrozumienie poprawnie,Różnica między PyMODINIT_FUNC i PyModule_Create

  1. PyMODINIT_FUNC w Pythona 2.X został zastąpiony przez PyModule_Create w Python3.X
  2. Zarówno powrócić PyObject* jednak w Pythonie 3. X, funkcja inicjalizacji modułu MUST zwrotny PyObject* do modułu - tj

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

    natomiast w Python2.X, nie jest to konieczne - to znaczy

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

Więc moje Sanity pytań sprawdzających są:

  • Czy moje rozumienie jest poprawne?
  • Dlaczego wprowadzono tę zmianę?

Teraz eksperymentuję tylko z bardzo prostymi przypadkami rozszerzeń C w Pythonie. Może gdybym robią więcej, odpowiedź na to byłoby oczywiste, a może gdybym próbował osadzić Python w coś innego ....

Odpowiedz

4
  1. Tak, rozumienie jest poprawne. Musisz zwrócić nowy obiekt modułu z funkcji initing z typem zwracanym PyMODINIT_FUNC. (PyMODINIT_FUNC deklaruje funkcję zwrotu void w python2 i zwraca PyObject * w python3.)

  2. Mogę tylko spekulować co do motywacji osób, które dokonały zmiany, ale uważam, że było tak, że błędy w importowanie modułu może być łatwiejsze do zidentyfikowania (możesz zwrócić NULL z funkcji module init w python3, jeśli coś poszło nie tak).