2012-04-21 27 views
4

我正在學習Python-C擴展,並且對使用關鍵字參數的方法爲什麼必須轉換爲PyCFunctions感到困惑。我對PyCFunction的理解是,它需要兩個指向PyObjects的指針並返回一個指向PyObject的單個指針 - 例如,Python C擴展 - 爲什麼使用關鍵字參數的方法強制轉換爲PyCFunction

PyObject* myFunc(PyObject* self, PyObject* args) 

如果我要使用使用關鍵字參數的函數,那麼這個功能將三分,PyO​​bjects並返回一個指針的PyObject - 例如

PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs) 

然而,當我創建模塊功能陣列(爲一個稱爲 '加法器' 功能):

{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" } 

工作正常。這感覺就像我將一個浮點數賦給一個int值,並仍然使用浮點數的非整數部分。如果我沒有看到這項工作,我會認爲這是行不通的。我在這裏不瞭解什麼?另外,我看到一些對PyCFunctionWithKeywords的引用,它似乎有我認爲我需要的函數簽名,但是我的編譯器抱怨(給出警告)'不兼容的指針類型'。

是否已棄用PyCFunctionWithKeywords?如果不是,有沒有一段時間我應該/必須使用它?

回答

4

如果你的函數處理關鍵字參數,那麼它必須對應一個PyCFunctionWithKeywords。但是,C不會重載,並且PyMethodDef構建的結構被定義爲期望PyCFunction,而不是完全不受控制的void *。所以你必須將你的PyCFunctionWithKeywords轉換爲PyCFunction來停止編譯器的抱怨,就這些了。

請記住,您還必須在flags中傳遞METH_KEYWORDS來告訴Python您的函數具有PyCFunctionWithKeywords而不是PyCFunction的簽名。

+0

因此,METH_KEYWORDS標誌告訴Python解釋器中的C例程之一轉回到PyCFunctionWithKeywords? – user1245262 2012-04-22 02:04:20

+0

是的,就是這樣(參見'PyCFunction_Call()'http://svn.python.org/projects/python/branches/pep-0384/Objects/methodobject.c)。 – yak 2012-04-22 09:22:56

+0

C語言本身並不保證將一個函數指針轉換爲void *可以成功地轉換回函數指針。 – 2015-03-11 23:09:44

相關問題