Python 理解PyDict_检查行为

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

我一直在玩Python C API有一段时间了。我很喜欢,但今天我遇到了障碍。我有一个Python扩展,它有一个函数,该函数需要一个或两个字典作为参数。我担心我可能误解了
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代码示例吗?