Найти тип объекта boost python

Я вложил python в С++, и я хотел бы знать, есть ли способ найти тип boost:: python:: object, который является результатом после выполнения функции модуля python. У меня есть мой код:

boost::python::object module_ = boost::python::import("..libName");
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...);
//suppose if the result is int,
int a_ = boost::python::extract<int>(result_);

Из приведенного выше фрагмента кода я хотел бы знать, есть ли способ найти тип результата до его извлечения. В приведенном выше коде результат result может быть любым типом, например list, tuple...

Ответ 1

Вы можете попробовать это

std::vector<std::string> list_to_vector(boost::python::list& l)
{
    for (int i = 0; i < len(n); ++i)
    {
        boost::python::extract<boost::python::object> objectExtractor(l[i]);
        boost::python::object o=objectExtractor();
        std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__"));
        std::cout<<"this is an Object: "<<object_classname<<std::endl;
    }
    ...................................................
    ...................................................
 }

Это работает для меня.

Ответ 2

Существует несколько способов получить тип объекта. Какой из них вы используете, зависит от того, в каком формате вы хотите получить результат. Вы можете использовать result_.attr("__class__"), чтобы получить класс как boost:: python:: object. Вы также можете использовать функцию PyObject_IsInstance, чтобы проверить, является ли это типом, который, по вашему мнению, является. Наконец, вы можете использовать функцию PyObject_Type, чтобы получить ее тип как PyObject *.

Ответ 3

Поскольку вы, похоже, хотите проверить, является ли это целым числом, вы можете использовать extract<T> x(o):

boost::python::extract<int> n(o);

if ( n.check() )
    // it an integer, or at least convertible to one
else
    // not an integer

В документации говорится:

извлечь x (o); строит экстрактор, чья функция-член функции check() могут быть использованы, чтобы спросить, доступно ли преобразование без исключение, которое нужно сбросить.

Это может звучать так, как будто float может считаться конвертируемым в целое, но я попробовал его, и это не так. Другими словами, я бы не верил, что каждый раз он делает все правильно!

Для встроенных типов, в данном случае целых чисел, я думаю, что более безопасно использовать PyInt_Check, но, по крайней мере, когда Я протестировал код здесь, он не был сразу доступен.

Другими словами, если вам нужно определить тип объектов, которые не являются встроенными Python, я бы выполнил @Areaux, используя PyObject_IsInstance. (Но мне было бы лучше, если бы у меня была чистая база кода Boost Python, а не смесь).