【问题标题】:Finding if member function exists in a Boost python::object查找成员函数是否存在于 Boost python::object 中
【发布时间】:2016-10-07 19:59:08
【问题描述】:

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

bp::object myInstance;
// ... myInstance is initialized
bp::object fun = myInstance.attr("myfunction");
fun();

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

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

有什么方法可以在不涉及异常或调用函数的情况下检查函数是否存在?

【问题讨论】:

  • // ... myInstance is initialized 在 C++ 中初始化一个 Python 对象是 boost::python 中文档记录最差的部分之一,在这里你忽略了它!

标签: python c++ boost boost-python


【解决方案1】:

即使函数不存在,对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();
    // ...
}

【讨论】:

  • 确实 myInstance.attr("myfunction") 确实抛出了异常,我不知道为什么我认为只有在调用函数时才抛出异常。我一定搞砸了初始代码中的异常保护。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多