找出PyObject方法需要多少个参数

时间:2012-11-21 11:46:31

标签: python python-c-api pyobject

我们可以使用

提取指向python方法的PyObject
PyObject *method = PyDict_GetItemString(methodsDictionary,methodName.c_str());

我想知道该方法需要多少个参数。所以如果函数是

def f(x,y):
    return x+y

我怎么知道它需要2个参数?

1 个答案:

答案 0 :(得分:0)

按照Jon提供的链接进行操作。假设您不希望(或不能)在您的应用程序中使用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通常会变得有点繁琐。