Я использую Boost Python для совместной работы C ++ и Python, и у меня есть код, который выглядит следующим образом: создается экземпляр объекта python и вызывается одна из его функций-членов.
bp::object myInstance;
// ... myInstance is initialized
bp::object fun = myInstance.attr("myfunction");
fun();
Я хотел бы проверить, существует ли функция-член, прежде чем вызывать ее. Если его не существует, я не хочу звонить.
Проблема в том, что вызов myInstance.attr («myfunction») успешен, даже если функция не существует. Следовательно, единственный способ проверить, существует ли функция в моем текущем коде, это попытаться вызвать ее и перехватить исключение.
Есть ли способ проверить, существует ли функция без исключения или вызова функции?
призыв к
myInstance.attr("myfunction")
успешно, даже если функция не существует
Уверен, это бросает AttributeError
,
Есть ли способ проверить, существует ли функция без исключения или вызова функции?
Одна из странных дыр в Boost.Python заключается в том, что он не имеет hasattr()
функция. Достаточно просто добавить:
namespace boost { namespace python {
bool hasattr(object o, const char* name) {
return PyObject_HasAttrString(o.ptr(), name);
}
} }
и тогда вы можете просто использовать его:
if (hasattr(myInstance, "myfunction")) {
bp::object fun = myInstance.attr("myfunction");
fun();
// ...
}
Других решений пока нет …