Найти тип объекта 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, а не смесь).