【发布时间】:2013-02-05 10:48:01
【问题描述】:
我已经使用 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(无,无)
myClass.doStuffToOtherStuff(无,dict())
myClass.doStuffToOtherStuff({}, 无)
#等等...
如果我将PyDict_Check 更改为PyDict_CheckExact,它将打印0 0,无论我作为参数传递什么。
任何见解将不胜感激。
【问题讨论】: