【发布时间】:2013-07-14 01:36:46
【问题描述】:
Python/C API 有许多相关的函数,它们执行类似的操作,其中一个通常用于一般用途,另一个在特定情况下更有效或更方便。
例如,PyDict_SetItem 和 PyDict_SetItemString 是相同的,但后者专门用于 C 字符串作为键。对于PyList_SetItem 和PyList_SET_ITEM,第二个没有错误检查,也没有对现有项目进行decref (explained here)。
但是当总是有Py_BuildValue 时,为什么会有像PyInt_FromLong 这样的特殊转换?两者都返回对 Python 对象的新引用,并且似乎做同样的事情。同样的问题也适用于 PyInt_FromSsize_t、PyTuple_Pack 等函数(当然,所有这些函数都与带有适当格式字符串的 Py_BuildValue 相比)。
什么时候应该使用一个而不是另一个?
【问题讨论】:
-
您可以查看
Py_BuildValue作为facade pattern 的结果。这是一个将许多低级调用组合在一起的高级调用。这不是必需的,但它很有用。显然,如果没有低级 API 的单个函数Py_BuildValue,您最终将需要维护数百行或更多行代码,因此您必须反其道而行之:级转换 API 和用于高级访问的外观函数,它更短且可维护。
标签: python python-c-api python-c-extension