2013-05-10 2 views
1

В CPython мы можем получить список аргументов функции, используя следующие методы. имя функции 'aMethod'Получение списка аргументов в функции Boost: Python

import inspect 
inspect.getargspec(aMethod) 

или

aMethod.func_code.co_varnames 

Как я могу достичь того же для форсиро- функции Python? Я получаю следующую ошибку, когда я использую эти методы для них.

первый метод TypeError: не является функцией Python

для второго метода AttributeError: объект 'aMethod' не имеет атрибута 'func_code'

ответ

1

При доступе к атрибуту Python на boost::python::object, используйте функцию члена 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) 
>>> 
+0

ошибка C2039: 'stl_input_iterator': не является членом "повышение :: питона. Я получаю эту ошибку при построении. Я использую Visual Studio 2010 для Windows 7 32-разрядных, Python 2.7 и Boost 1.47. – maheshakya

+0

после импорта stl_iterator он работает, но дает ту же ошибку при получении списка аргументов с использованием этого метода. – maheshakya

+0

Хорошо. Я понял. возникла проблема в функции, в которой я использовал аргументы. Проблема в этом работает только тогда, когда Python запускается в командной строке. Но в любом случае он работает сейчас: D. Thnaks – maheshakya