【问题标题】:Understanding PyDict_Check behaviour了解 PyDict_Check 行为
【发布时间】:2013-02-05 10:48:01
【问题描述】:

我已经使用 Python C API 有一段时间了。我非常喜欢它,但今天我遇到了障碍。我有一个 Python 扩展,它有一个函数,它需要一个或两个字典作为参数。我担心我可能误解了PyDict_CheckPyArg_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,无论我作为参数传递什么。

任何见解将不胜感激。

【问题讨论】:

    标签: python cpython


    【解决方案1】:

    带有O 参数的PyArg_ParseTuple 需要一个指向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代码示例吗?
    猜你喜欢
    • 2016-09-28
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多