Cha*_*l72 5 c python python-c-api
我在Python C API中发现了一个PyEval_CallFunction看起来很有用的函数.它允许您通过说出以下内容来调用Python可调用:
PyEval_CallFunction(obj, "OOO", a, b, c);
Run Code Online (Sandbox Code Playgroud)
但是,我找不到关于此功能的任何官方文档.谷歌搜索提出了讨论这个功能的各种非官方教程,但是:
官方Python文档中没有记录该函数,因此我不知道它是否应该是公共API的一部分.
搜索Web会出现不一致的使用策略.一些教程表明格式字符串需要在类型列表周围使用括号,比如
"(OiiO)",有时我看到它在没有括号的情况下使用.当我在实际程序中实际尝试该函数时,它似乎需要括号,否则它是段错误.
我想使用这个功能,因为它很方便.有没有人知道这件事,或者知道为什么没有记录?它是公共API的一部分吗?
我也找不到很多引用,但你链接的教程提到了这个:
字符串格式和以下参数与Py_BuildValue(XXX,所以我现在应该已经描述过了!).像这样的电话
Run Code Online (Sandbox Code Playgroud)PyEval_CallFunction(obj, "iii", a, b, c);相当于
Run Code Online (Sandbox Code Playgroud)PyEval_CallObject(obj, Py_BuildValue("iii", a, b, c));
我认为PyEval_CallFunction它不是公共API,因为它的价值似乎相当有限.这两者之间没有太大区别.但话说回来,我并没有真正参与python扩展,所以这只是我对此的看法.
PyEval_CallObject本身只是一个宏观PyEval_CallObjectWithKeywords.
#define PyEval_CallObject(func,arg) \
PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Run Code Online (Sandbox Code Playgroud)
关于"什么是公共API?" 这是Martinv.Löwis最近的消息:
只是为了强调并支持Georg的解释:API 不是通过文档定义的,而是主要通过头文件定义的.声明为PyAPI_FUNC且不以_Py开头的所有函数都是公共API.曾经有很多未记录的API(最多1.4个,根本没有API文档,只有扩展模块教程); 如今,越来越多的API被记录在案.
http://mail.python.org/pipermail/python-dev/2011-February/107973.html
它没有记录的原因是因为你应该使用PyObject_CallFunction.
该PyEval_*函数族是由解释评价循环原始内部呼叫.相应的文档PyObject_*调用包括所有其他解释器状态完整性检查,参数验证和堆栈保护.