我正在使用 Python C API 从我的应用程序调用 Python 函数。我想提供一个可以调用的函数列表,并希望能够将此列表限制为具有预期参数数量的函数。
我很高兴我可以遍历字典来提取函数列表并用于PyCallable_Check确定它们是否可调用,但我不确定如何找出每个函数期望的参数数量?
我发现了一种涉及 Boost::Python 的技术,但我宁愿不添加它,因为(我希望!)将是一个小添加。
谢谢 :)
好的,所以最后我发现了如何做到这一点。用户定义的 Python 函数有一个名为func_code(在 Python 3.0+ 中是__code__)的成员co_argcount,它本身有一个成员,这大概是 Boost::Python 在 Christophe 给出的示例中提取的内容。
我使用的代码看起来像这样(它在很大程度上基于如何遍历 Python 字典的文档示例):
PyObject *key, *value;
int pos = 0;
while(PyDict_Next(pyDictionary, &pos, &key, &value)) {
if(PyCallable_Check(value)) {
PyObject* fc = PyObject_GetAttrString(value, "func_code");
if(fc) {
PyObject* ac = PyObject_GetAttrString(fc, "co_argcount");
if(ac) {
const int count = PyInt_AsLong(ac);
// we now have the argument count, do something with this function
Py_DECREF(ac);
}
Py_DECREF(fc);
}
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,谢谢 - 该线程确实引导我走向正确的方向:)