我一直在玩 Python C API 一段时间。我非常喜欢它,但今天我遇到了障碍。我有一个 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
无论我作为参数传递什么。
任何见解将不胜感激。