2

我一直在玩 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_CheckExact0 0无论我作为参数传递什么。

任何见解将不胜感激。

4

1 回答 1

1

PyArg_ParseTuplewith Oarguments 需要一个指向 a 的指针PyObject *,而不是指向 a 的指针PyObject(即可变参数应该是 type 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);

  // ...
于 2013-02-05T10:57:59.617 回答