2016-10-07 70 views
2

我使用Boost Python來使C++和Python一起運行,我有一個如下所示的代碼,創建一個python對象的實例並調用它的一個成員函數。查找成員函數是否存在於Boost python :: object中

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

我想在調用它之前檢查成員函數是否存在。如果它不存在,我不想打電話。

問題是:即使該函數不存在,對myInstance.attr(「myfunction」)的調用也會成功。因此,測試當前代碼中是否存在函數的唯一方法是嘗試調用它並捕獲異常。

有什麼辦法來檢查函數是否存在,而不涉及異常或調用函數?

+0

'// ...將myInstance是initialized'在C++中初始化一個Python對象是最糟糕的一個'boost :: python'文檔化的部分,在這裏你把它放棄了! – caps

回答

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(); 
    // ... 
} 
+0

確實myInstance.attr(「myfunction」)確實會拋出一個異常,我不知道爲什麼我只是在調用該函數時才拋出異常。在我最初的代碼中,我一定弄亂了這些異常看守。 – sunmat

相關問題