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

如何从C中找到Python函数的参数数量?,python,c,Python,C,我正在使用Python C API从我的应用程序中调用Python函数。我想给出一个可以调用的函数列表,并希望能够将此列表限制为具有预期参数数的函数 我很高兴能够浏览字典提取函数列表,并使用PyCallable\u Check来确定它们是否可调用,但我不确定如何确定每个函数需要多少参数 我发现了一种涉及Boost::Python的技术,但我不想添加它,因为(我希望!)这将是一个小的添加 谢谢:)(未经测试,此线程中可能有相关信息)您的C代码可以像任何Python代码一样(例如,通过或其他等效方式

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

我很高兴能够浏览字典提取函数列表,并使用
PyCallable\u Check
来确定它们是否可调用,但我不确定如何确定每个函数需要多少参数

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


谢谢:)

(未经测试,此线程中可能有相关信息)

您的C代码可以像任何Python代码一样(例如,通过或其他等效方式)调用,并获取有关每个函数或其可能关心的其他可调用函数的签名的所有独家信息。

好的,所以最后我发现了怎么做。用户定义的Python函数有一个名为
func\u code
(在Python 3.0+中是
\uuu code\uu
)的成员,它本身有一个成员
co\u argcount
,这大概就是Christophe给出的示例中Boost::Python提取的内容

我正在使用的代码如下所示(它主要基于如何浏览Python字典的文档示例):


无论如何,谢谢你-这条线索确实把我引向了正确的方向:)

Am upvoting,因为确实有相关的信息:)
   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);
         }
      }
   }