这是您链接到的问题的答案 https://stackoverflow.com/questions/1117164/how-to-find-the-number-of-parameters-to-a-python-function-from-c/1117518#1117518似乎就是你想要的。inspect.getargspec
在Python方面完全符合你的要求,正如答案所述,你可以使用PyObject_CallMethod http://docs.python.org/c-api/object.html?highlight=pyobject_callmethod#PyObject_CallMethod或要调用的链接目标中描述的相关函数之一inspect.getargspec
从您的 C++ 代码中获取返回的元组PyObject
, use PyTuple_GetItem(returned_tuple, 0)
获取参数列表,然后使用PyObject_Size()
or PyObject_Length()
在列表上获取参数的数量。您还需要检查返回的元组的第二个和第三个元素,并将两个不存在的元素的参数数量增加 1。Py_None
。请参阅下面的代码片段了解原因。
>>> import inspect
>>> def testfunc(a, b, c, *d, **e):
pass
>>> inspect.getargspec(testfunc)
ArgSpec(args=['a', 'b', 'c'], varargs='d', keywords='e', defaults=None)
以下是您应该执行的操作的示例(并非所有可能的错误都会被检查,但应该是所有可能需要的 NULL 检查):
PyObject *pName, *pInspect, *argspec_tuple, *arglist;
int size;
pName = PyString_FromString("inspect");
if (pName)
{
pInspect = PyImport_Import(pName);
Py_DECREF(pName);
if (pInspect)
{
pName = PyString_FromString("getargspec");
if (pName)
{
argspec_tuple = PyObject_CallMethodObjArgs(pInspect, pName, pFunc, NULL);
Py_DECREF(pName);
if (argspec_tuple)
{
arglist = PyTuple_GetItem(argspec_tuple, 0);
if (arglist)
{
size = PyObject_Size(arglist)
+ (PyTuple_GetItem(argspec_tuple, 1) == Py_None ? 0 : 1)
+ (PyTuple_GetItem(argspec_tuple, 2) == Py_None ? 0 : 1); // Haven't actually tested this, but it should work
}
}
}
}
}