0

我在 python 中有一个用户定义的函数,我不知道它有多少个参数。即可以

def f1(x,y,z):
  return  sin(x)*cos(y)*tan(z)

或者

def f1(x):
  return  sin(x)

我如何使用 Boost-Python 来查找函数有多少个参数?如果我只有 1 个函数参数,我总是可以这样评估:

  bp::object f1 = main_dict["f1"];
  std::cout << bp::extract<double>(f1(0.0)) << std::endl;
4

2 回答 2

2

对于python中的用户自定义函数,可以通过特殊属性来提取函数的arity 。func_code该属性表示编译后的函数体,并提供co_argcount指示函数的数量的属性。有关更多信息和其他可能的方法,请考虑阅读问题。

忽略错误检查,Boost.Python 实现变得相当简单:

boost::python::extract<std::size_t>(fn.attr("func_code").attr("co_argcount"));

这是一个完整的简短示例:

#include <iostream>
#include <boost/python.hpp>

void print_arity(boost::python::object fn)
{
  std::size_t arity = boost::python::extract<std::size_t>(
                        fn.attr("func_code").attr("co_argcount"));
  std::cout << arity << std::endl;
}

BOOST_PYTHON_MODULE(example)
{
  def("print_arity", &print_arity);
}

及其用法:

>>> from example import print_arity
>>> def f1(x,y,z): pass
... 
>>> print_arity(f1)
3
>>> def f1(x): pass
... 
>>> print_arity(f1)
1
于 2013-01-07T14:47:15.953 回答
1
def foobar(x, *args):
    return len(args) + 1

参数列表中的*args将参数列表中未明确定义的所有额外参数分配给列表args(此名称是用户定义的)。假设函数必须至少有一个参数,上述函数将返回参数的数量。

免责声明:我对 Boost.Python 没有任何经验。这个答案只是 Python 中的实现,将返回值转换为 C++ 取决于用户。

于 2013-01-06T21:00:20.243 回答