我在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;
答案 0 :(得分:2)
对于python中的用户定义函数,可以通过func_code
特殊属性提取函数的arity。此属性表示已编译的函数体,并提供指示函数arity的co_argcount
属性。有关更多信息和其他可能的方法,请考虑阅读this问题。
忽略错误检查,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
答案 1 :(得分:1)
def foobar(x, *args):
return len(args) + 1
参数列表中的*args
将未在参数列表中明确定义的所有额外参数分配给列表args
(此名称是用户定义的)。假设函数必须至少有一个参数,上面的函数将返回参数的数量。
免责声明:我对Boost.Python没有任何经验。这个答案仅仅是Python中的实现,将返回值传递给C ++取决于用户。