在CPython中,我们可以通过以下方法获取函数的参数列表。 函数名称是'aMethod'
import inspect
inspect.getargspec(aMethod)
或
aMethod.func_code.co_varnames
如何为Boost实现相同的功能:Python功能?当我使用这些方法时,我得到以下错误。
表示第一种方法 TypeError:不是Python函数
表示第二种方法 AttributeError:'aMethod'对象没有属性'func_code'
答案 0 :(得分:1)
访问boost::python::object
上的Python属性时,请使用attr
成员函数。例如:
aMethod.func_code.co_varnames
会变成
aMethod.attr("func_code").attr("co_varnames")
这是一个完整的例子。
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/python.hpp>
#include <boost/python/stl_iterator.hpp>
void print_varnames(boost::python::object fn)
{
namespace python = boost::python;
typedef python::stl_input_iterator<std::string> iterator;
std::vector<std::string> var_names(
iterator(fn.attr("func_code").attr("co_varnames")),
iterator());
BOOST_FOREACH(const std::string& varname, var_names)
std::cout << varname << std::endl;
}
BOOST_PYTHON_MODULE(example)
{
def("print_varnames", &print_varnames);
}
用法:
>>> def test1(a,b,c): pass
...
>>> def test2(spam, eggs): pass
...
>>> def test3(): pass
...
>>> from example import print_varnames
>>> print_varnames(test1)
a
b
c
>>> print_varnames(test2)
spam
eggs
>>> print_varnames(test3)
>>>
答案 1 :(得分:0)
小心:此方法将打印出函数中的所有所有变量,而不仅仅是其参数。发挥作用:
def test4(a, b):
c = a + b
>>> test4.__code__.co_varnames
('a', 'b', 'c')
如果您确实只需要函数参数,则只需使用inspect
模块:
// given f as callable boost::python::object
auto inspect = python::import("inspect");
auto argspec = inspect.attr("getargspec")(f);
// returns args in argspec[0] (and varargs in [1], keywords in [2], and defaults in [3]).