我使用Boost Python使C ++和Python一起运行,我有一个看起来像这样的代码,创建一个python对象的实例并调用它的一个成员函数。
bp::object myInstance;
// ... myInstance is initialized
bp::object fun = myInstance.attr("myfunction");
fun();
我想在调用之前检查成员函数是否存在。如果它不存在,我不想打电话。
问题是:即使函数不存在,对myInstance.attr(" myfunction")的调用也会成功。因此,测试函数是否存在于当前代码中的唯一方法是尝试调用它并捕获异常。
有没有办法检查函数是否存在而不涉及异常或调用函数?
答案 0 :(得分:5)
即使该功能不存在,对
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();
// ...
}