15

私の理解が正しければ、

  1. Python 2.X の PyMODINIT_FUNC は Python3.X で置き換えられましPyModule_Createた。
  2. どちらも を返しPyObject*ますが、Python 3.X では、モジュールの初期化関数は をモジュールに返さなければなりませんPyObject*。つまり、

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

    一方、Python2.X では、これは必要ありません。

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

したがって、私の健全性チェックの質問は次のとおりです。

  • 私の理解は正しいですか?
  • なぜこの変更が行われたのですか?

現在、私は Python の C 拡張の非常に単純なケースのみを試しています。おそらく、私がもっとやっていたら、これに対する答えは明らかだったでしょう。あるいは、Python を何か他のものに埋め込もうとしていたのかもしれません....

4

1 に答える 1

8
  1. はい、あなたの理解は正しいです。戻り値の型 PyMODINIT_FUNC を使用して、初期化関数から新しいモジュール オブジェクトを返さなければなりません。(PyMODINIT_FUNC は、python2 では void を返す関数を宣言し、python3 では PyObject* を返す関数を宣言します。)

  2. 変更を行った人々の動機については推測することしかできませんが、モジュールをインポートする際のエラーをより簡単に特定できるようにするためだったと思います (何か問題が発生した場合、python3 の module-init 関数から NULL を返すことができます)。 )。

于 2012-05-16T20:19:08.280 に答える