查找Boost python :: object中是否存在成员函数

sun*_*mat 3 c++ python boost boost-python

我正在使用Boost Python来使C++和Python一起运行,我有一个看起来像这样的代码,创建一个python对象的实例并调用它的一个成员函数.

bp::object myInstance;
// ... myInstance is initialized
bp::object fun = myInstance.attr("myfunction");
fun();
Run Code Online (Sandbox Code Playgroud)

我想在调用之前检查成员函数是否存在.如果它不存在,我不想打电话.

问题是:即使函数不存在,对myInstance.attr("myfunction")的调用也会成功.因此,测试函数是否存在于当前代码中的唯一方法是尝试调用它并捕获异常.

有没有办法检查函数是否存在而不涉及异常或调用函数?

Bar*_*rry 6

myInstance.attr("myfunction")即使函数不存在,调用也会成功

很确定它会抛出一个AttributeError.

有没有办法检查函数是否存在而不涉及异常或调用函数?

Boost.Python中一个奇怪的漏洞就是它没有hasattr()函数.添加以下内容非常简单:

namespace boost { namespace python {
    bool hasattr(object o, const char* name) {
        return PyObject_HasAttrString(o.ptr(), name);
    }
} }
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

if (hasattr(myInstance, "myfunction")) {
    bp::object fun = myInstance.attr("myfunction");
    fun();
    // ...
}
Run Code Online (Sandbox Code Playgroud)