Python 理解PyDict_检查行为
我一直在玩Python C API有一段时间了。我很喜欢,但今天我遇到了障碍。我有一个Python扩展,它有一个函数,该函数需要一个或两个字典作为参数。我担心我可能误解了Python 理解PyDict_检查行为,python,cpython,Python,Cpython,我一直在玩Python C API有一段时间了。我很喜欢,但今天我遇到了障碍。我有一个Python扩展,它有一个函数,该函数需要一个或两个字典作为参数。我担心我可能误解了PyDict\u Check或PyArg\u parsetup的工作原理。下面是一个简单的例子: static PyObject * doStuffToOtherStuff(MyCustomPyObject *self, PyObject *args) { char const *fmt = "OO"; PyObject
PyDict\u Check
或PyArg\u parsetup
的工作原理。下面是一个简单的例子:
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)
我希望它可以打印10
,但实际上它可以打印11
。因此:
myClass.doStuffToOtherStuff(无,无)
myClass.doStuffToOtherStuff(无,dict())
myClass.dostufftotherstuff({},无)
#等等
如果我将PyDict\u Check
更改为PyDict\u CheckExact
它将打印0
,而不管我将什么作为参数传递
任何洞察都将不胜感激。
PyArg\u ParseTuple
带O
参数的PyObject*
指针,而不是PyObject
(即变量参数应为PyObject**
类型)
因此,您的代码应该是:
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);
// ...
有返回这两个对象的python代码示例吗?