如何从C中找到Python函数的参数个数?
我正在使用Python的C接口来从我的应用程序调用Python函数。我想展示一个可以调用的函数列表,并希望能够限制这个列表,只显示那些参数数量符合预期的函数。
我很高兴我可以遍历字典来提取函数列表,并使用PyCallable_Check
来检查这些函数是否可以调用,但我不太确定如何知道每个函数期望多少个参数。
我找到了一种涉及Boost::Python的技术,但我希望不必添加这个库,因为我希望这只是一个小改动。
谢谢 :)
3 个回答
0
你的C代码可以像任何Python代码一样调用 inspect.getargspec,比如通过 PyObject_CallMethod 或其他类似的方法。这样你就能获取到每个函数或其他可调用对象的详细信息,比如它们的参数信息。
1
也许这个链接对你有帮助?(没有测试过,可能这个讨论串里有一些相关的信息)...
5
好的,最后我发现了怎么做。用户自定义的Python函数有一个叫做 func_code
的成员(在Python 3.0及以上版本中是 __code__
),这个成员里面还有一个叫 co_argcount
的成员,估计就是Christophe给出的例子中Boost::Python提取的内容。
我使用的代码看起来是这样的(这段代码主要是基于一个文档示例,讲的是如何遍历一个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);
}
}
}
无论如何,谢谢你 - 那个讨论串确实让我找到了正确的方向 :)