什麼是適當的方式返回包含從C擴展到Python一None
值的元組?我知道,一個None
值可以使用如何返回一個包含從C API None值的元組?
result = Py_BuildValue("");
和一個元組可以使用類似
result = Py_BuildValue("(ii)", 123, 456);
被創建,但我不明白的方式結合本獲得,例如創建,一個包含適當整數和None
值的元組。
什麼是適當的方式返回包含從C擴展到Python一None
值的元組?我知道,一個None
值可以使用如何返回一個包含從C API None值的元組?
result = Py_BuildValue("");
和一個元組可以使用類似
result = Py_BuildValue("(ii)", 123, 456);
被創建,但我不明白的方式結合本獲得,例如創建,一個包含適當整數和None
值的元組。
這裏只有一個永遠在None
Python對象,你可以隨時引用它在C作爲Py_None
。
代碼...
result = Py_BuildValue("");
...只是遞增的Py_None
引用計數,並返回它的指針,所以它的同...
Py_INCREF(Py_None);
result = Py_None;
如果你只是想返回None
,然後用...
Py_INCREF(Py_None);
return Py_None;
...或者,從Python 2.4開始,你可以做同樣的事情NG了宏...
Py_RETURN_NONE;
如果你在一個元組返回,就像這樣......
return Py_BuildValue("(O)", Py_None);
...有沒有必要增加引用計數 - Py_BuildValue()
會替你。
但是,如果你在這樣一個元組返回它...
PyObject* tuple = PyTuple_New(1);
Py_INCREF(Py_None);
PyTuple_SetItem(tuple, 0, Py_None);
return tuple;
...那麼你必須增加引用計數,因爲PyTuple_SetItem()
不會爲你做。
result = Py_BuildValue("(isi)", 123, NULL, 456);
...或'Py_BuildValue( 「(IOI)」,123,Py_None,456)' – Aya 2013-05-06 14:29:29
謝謝,這工作正常。抱歉不接受你的回答,我的行爲太快了。我接受了綾的回答,因爲它似乎更合適。使用'NULL'字符串感覺有點像對我來說是一個黑客。 – 2013-05-06 14:43:58
是使用'Py_BuildValue( 「(O)」,Py_None)'時,需要明確的引用計數增量? [O'的'Py_BuildValue()'](http://docs.python.org/2/c-api/arg.html#Py_BuildValue)的文檔狀態:*傳遞一個Python對象(觸發器除外)算,其加一)* – 2013-05-06 14:56:12
@ReinierTorenbeek對不起。我重新檢查了文檔,並意外地閱讀了錯誤的章節,更新了答案,然後意識到了錯誤,並恢復了答案。 – Aya 2013-05-06 14:57:34
@ReinierTorenbeek再次更新了答案。 FWIW,後一種方法稍微快一點,因爲它不必分析格式字符串。爲廣泛的答案 – Aya 2013-05-06 15:11:24