私はしばらく Python C API をいじっています。とても気に入っていますが、今日は障害にぶつかりました。1 つまたは 2 つの辞書を引数として期待する関数を持つ Python 拡張機能があります。PyDict_Check
、またはがどのように機能するかを誤解したのではないかと心配していPyArg_ParseTuple
ます。以下は簡単な例です:
static PyObject * doStuffToOtherStuff(MyCustomPyObject *self, PyObject *args) {
char const *fmt = "OO";
PyObject dict1, dict2;
if (!PyArg_ParseTuple(args, fmt, &dict1, &dict2))
return NULL;
int hasDict1 = PyDict_Check(&dict1);
int hasDict2 = PyDict_Check(&dict2);
printf("%d %d\n");
Py_INCREF(Py_None);
return Py_None;
}
ビルドしてインポートすると、たとえば次のように呼び出します。
myClass.doStuffToOtherStuff(dict(), None)
これが印刷されることを期待しています 1 0
が、実際には印刷され 1 1
ます。同様に: myClass.doStuffToOtherStuff(None, None) myClass.doStuffToOtherStuff(None, dict()) myClass.doStuffToOtherStuff({}, None) #etc...
変更PyDict_Check
すると、引数として何を渡しても、代わりにPyDict_CheckExact
印刷されます。0 0
どんな洞察も大歓迎です。