4

私はC拡張機能を書いていますが、引数としてdictを受け取る方法にかなり迷っています。ドキュメントにはこれを実現する方法の詳細がないため、引数をPythonオブジェクトとして解析し、それをdictとして操作しようとしました。

PyTypeObject *dict;

if(!PyArg_ParseTuple(args, "o", &dict))
    return NULL;

しかし、コードは解析に失敗します:

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import plotting
>>> plotting.plot({'wff':0})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be impossible<bad format char>, not dict

エラーメッセージから理解できる限り、charの形式は間違っています(「o」はPythonオブジェクトを表す必要があると思いました)。

Python dictをCポインターに解析するための最良の方法は何ですか?ドキュメントを調べていますが、これに似たものは見つかりませんでした。

ありがとうございました。

4

1 に答える 1

10

ここにはいくつか問題があります。まず第一に、PyTypeObject型は特に型を定義する構造体用です。タイプオブジェクトの詳細については、http://docs.python.org/2/c-api/typeobj.htmlを参照 してください。ただし、これは必要なものではありません。使用する任意のPythonオブジェクトへのポインタPyObject*

次に、任意のPythonオブジェクトの型コードは"O"(大文字)ではありません"o"。それが辞書であることをタイプチェックしたい場合は、それを使用することもできます。これには、タイプオブジェクトのアドレスに続いて、返され"O!"たオブジェクトのアドレスを渡す必要があります。例えば:PyObject*PyObject*

PyObject* dict;
PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict);

これにより、オブジェクトが* dictポインターに返され、dictTypeErrorでない場合はaが発生します。ただし、絶対にdictである必要がない限り、オブジェクトがマッピングインターフェイスを実装しているかどうかを確認するために、これに反対することをお勧めします。しかし、それは別の質問です。

于 2012-11-07T19:12:06.643 に答える