在Boost:Python函数中获取参数列表

时间:2013-05-10 12:05:20

标签: python boost python-2.7 boost-python cpython

在CPython中,我们可以通过以下方法获取函数的参数列表。 函数名称是'aMethod'

import inspect
inspect.getargspec(aMethod)

aMethod.func_code.co_varnames

如何为Boost实现相同的功能:Python功能?当我使用这些方法时,我得到以下错误。

表示第一种方法 TypeError:不是Python函数

表示第二种方法 AttributeError:'aMethod'对象没有属性'func_code'

2 个答案:

答案 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]).