我们可以使用以下方法提取指向 python 方法的 PyObject
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
我想知道该方法需要多少个参数。所以如果函数是
def f(x,y):
return x+y
我如何找出它需要 2 个参数?
我们可以使用以下方法提取指向 python 方法的 PyObject
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());
我想知道该方法需要多少个参数。所以如果函数是
def f(x,y):
return x+y
我如何找出它需要 2 个参数?
跟随乔恩提供的链接。假设您不想(或不能)在您的应用程序中使用 Boost,以下应该为您提供数字(很容易改编自How to find the number of parameters to a Python function from C?):
PyObject *key, *value;
int pos = 0;
while(PyDict_Next(methodsDictionary, &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);
}
}
}
如果您使用的是 Python 2.x,那么上述内容肯定有效。在 Python 3.0+ 中,您似乎需要在上面的代码段中使用"__code__"
而不是"func_code"
。
我很欣赏无法使用 Boost(我的公司不会允许它用于我最近一直在从事的项目),但总的来说,如果可以的话,我会尽量使用它,因为我发现当你尝试做这样复杂的事情时,Python C API 通常会变得有点繁琐。