我正在使用Python C API从我的应用程序中调用Python函数。我想提供一个可以调用的函数列表,并希望能够将此列表限制为具有预期参数数量的函数。
我很高兴我可以走字典来提取函数列表并使用PyCallable_Check
来查明它们是否可调用,但我不知道如何找出每个函数有多少参数功能是期待的吗?
我发现了一种涉及Boost :: Python的技术,但宁愿不添加它(我希望!)将是一个小小的补充。
谢谢:)
答案 0 :(得分:4)
好的,最后我发现了如何做到这一点。用户定义的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);
}
}
}
非常感谢 - 那个线程确实引导我朝着正确的方向前进:)
答案 1 :(得分:1)
Maybe this is helpful?(未经测试,此线程中可能存在相关信息)...
答案 2 :(得分:0)
您的C代码可以像任何Python代码一样调用inspect.getargspec(例如通过PyObject_CallMethod或其他等效方式)并获取关于每个函数的签名或其可能关注的其他可调用的所有信息约。