2016-10-07 2 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のは、C++でPythonオブジェクトを初期化するinitialized'で最も悪いの一つであります'boost :: python'の文書化された部分とここではそれを残しました! – caps

答えて

5

myInstance.attr("myfunction")への呼び出しは、関数が

それはAttributeErrorをスローかなり確信して存在しない場合でも、成功しています。

例外が含まれていないか関数を呼び出すことなく関数が存在するかどうかを確認する方法はありますか?

Boost.Pythonの奇妙なホールの1つは、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

関連する問題