如何从C中找到Python函数的参数数量?

Pet*_*ter 3 c python

我正在使用 Python C API 从我的应用程序调用 Python 函数。我想提供一个可以调用的函数列表,并希望能够将此列表限制为具有预期参数数量的函数。

我很高兴我可以遍历字典来提取函数列表并用于PyCallable_Check确定它们是否可调用,但我不确定如何找出每个函数期望的参数数量?

我发现了一种涉及 Boost::Python 的技术,但我宁愿不添加它,因为(我希望!)将是一个小添加。

谢谢 :)

Pet*_*ter 5

好的,所以最后我发现了如何做到这一点。用户定义的 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);
         }
      }
   }
Run Code Online (Sandbox Code Playgroud)

无论如何,谢谢 - 该线程确实引导我走向正确的方向:)