Python C扩展 - 接收dict作为参数

时间:2012-11-07 18:47:43

标签: python c python-c-api python-c-extension

我正在写一个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指针的最佳方法是什么?我正在挖掘文档,但我没有找到类似的东西。

谢谢。

1 个答案:

答案 0 :(得分:10)

你在这里遇到了一些问题。首先,PyTypeObject类型专门用于定义类型的结构。您可以在此处阅读有关类型对象的更多信息:http://docs.python.org/2/c-api/typeobj.html这不是您想要的。对于要使用PyObject*的任意Python对象的指针。

其次,任意Python对象的类型代码是"O"(大写)而不是"o"。如果你想进行类型检查它是一个字典你也可以使用"O!"这要求你传递一个类型对象的地址,后跟你想要存储返回的PyObject*的地址PyObject*进入。例如:

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

这会将对象返回到* dict指针,如果它不是dict,则引发TypeError。但是,除非你绝对需要它作为一个字典,我建议不要这样做,以支持检查对象是否实现了映射接口。但这是一个不同的问题。