PythonC扩展-接收dict作为参数

PythonC扩展-接收dict作为参数,python,c,python-c-api,python-c-extension,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 App

我正在写一个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
Python 2.7.2(默认值,2012年6月20日,16:23:33)
达尔文的[GCC 4.2.1兼容Apple Clang 4.0(标签/Apple/Clang-418.0.60)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入绘图
>>>plot.plot({'wff':0})
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:必须是不可能的,而不是dict
据我从错误消息中了解,char格式是错误的(我认为“o”应该表示任何Python对象)

将Python dict解析为C指针的最佳方法是什么?我正在翻阅文档,但没有发现任何类似的内容


谢谢。

这里有几个问题。首先,
PyTypeObject
类型专门用于定义类型的结构。您可以在这里阅读有关类型对象的更多信息:但这不是您想要的。对于指向要使用的任意Python对象的指针,
PyObject*

其次,任意Python对象的类型代码是
“O”
(大写)而不是
“O”
。如果要执行类型检查,确保它是一个字典,您也可以使用
“O!”
这要求您传递类型对象的地址,后跟要将返回的
PyObject*
存储到中的
PyObject*
的地址。例如:

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

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

PyArg_ParseTuple函数中的大写字母“O”不应该吗?将此作为答案发布,我很乐意接受。是否希望它是PyArg_ParseTuple(args,“0!”,&PyDict_type,&dict)OMG!我花了很多时间寻找类似错误的原因。错过了大写字母“O”而不是小写字母“O”之后,感觉自己像个傻瓜。无论如何,非常感谢!!