【发布时间】:2012-03-26 17:32:11
【问题描述】:
我正在尝试使用 PySequence_Length 来获取 C 语言中 Python 字典的长度。我意识到我可以使用 PyDict_Size,但我有兴趣在某些情况下使用更通用的函数。
PyObject* d = PyDict_New();
Py_ssize_t res = PySequence_Length(d);
printf("Result : %ld\n", res);
if (res == -1) PyErr_Print();
这失败,并打印错误:
TypeError: 'dict' 类型的对象没有 len()
我的问题是:为什么会失败?虽然 Python 字典对象不支持 Sequence 协议,但 PySequence_Length 的 documentation 表示:
Py_ssize_t PySequence_Length(PyObject *o)
成功时返回序列 o 中的对象数,成功时返回 -1 失败。对于不提供序列协议的对象,这是 相当于 Python 表达式 len(o)。
由于字典类型确实具有__len__ 属性,并且由于表达式len(d)(其中d 是字典)正确返回Python 中的长度,我不明白为什么PySequence_Length 会失败C.
有什么解释吗?这里的文档不正确吗?
【问题讨论】:
标签: python python-3.x cpython python-c-api