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

3 投票
3 回答
1575 浏览
提问于 2025-04-15 12:51

我正在使用Python的C接口来从我的应用程序调用Python函数。我想展示一个可以调用的函数列表,并希望能够限制这个列表,只显示那些参数数量符合预期的函数。

我很高兴我可以遍历字典来提取函数列表,并使用PyCallable_Check来检查这些函数是否可以调用,但我不太确定如何知道每个函数期望多少个参数。

我找到了一种涉及Boost::Python的技术,但我希望不必添加这个库,因为我希望这只是一个小改动。

谢谢 :)

3 个回答

0

你的C代码可以像任何Python代码一样调用 inspect.getargspec,比如通过 PyObject_CallMethod 或其他类似的方法。这样你就能获取到每个函数或其他可调用对象的详细信息,比如它们的参数信息。

1

也许这个链接对你有帮助?(没有测试过,可能这个讨论串里有一些相关的信息)...

5

好的,最后我发现了怎么做。用户自定义的Python函数有一个叫做 func_code 的成员(在Python 3.0及以上版本中是 __code__),这个成员里面还有一个叫 co_argcount 的成员,估计就是Christophe给出的例子中Boost::Python提取的内容。

我使用的代码看起来是这样的(这段代码主要是基于一个文档示例,讲的是如何遍历一个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);
         }
      }
   }

无论如何,谢谢你 - 那个讨论串确实让我找到了正确的方向 :)

撰写回答