4

我正在编写一个 C 扩展,我对如何接收一个 dict 作为参数感到很困惑。由于文档没有关于如何实现这一点的任何细节,我尝试将参数解析为 Python 对象,然后将其作为字典进行操作:

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"(大写) not "o"。如果你想做一个类型检查它是一个字典,你也可以使用"O!"这需要你传递一个类型对象的地址,然后是PyObject*你想要存储返回的地址PyObject*。例如:

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

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

于 2012-11-07T19:12:06.643 回答