2

私はしばらく Python C API をいじっています。とても気に入っていますが、今日は障害にぶつかりました。1 つまたは 2 つの辞書を引数として期待する関数を持つ 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_CheckExact印刷されます。0 0

どんな洞察も大歓迎です。

4

1 に答える 1

1

PyArg_ParseTuplewith引数は、へのポインタではなく、Oへのポインタを期待します(つまり、可変個引数は型である必要があります)。PyObject *PyObjectPyObject **

したがって、コードは次のようになります。

  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 に答える