swigを使用してC++ライブラリのPythonラッパーを生成しています。私は、生成されたpythonモジュールをipythonを使用してインタラクティブに使用する傾向があります。
次のC++クラスがあるとします。
class test
{
int num;
int foo();
};
Swigは、このクラスをpythonクラスでラップします。
class test:
def foo():...
__swig_getmethods__["num"] = ...
__swig_setmethods__["num"] = ...
.
.
.
ipythonでインタラクティブに使用する場合。タブを補完すると「foo」は正常に検出されますが、「num」は検出されないことに気付きました。
少し掘り下げた後、ipythonがタブ補完に「dir」メソッドを使用していることがわかりました。swigが非関数クラスのメンバーを生成する方法は、__setattr__
とを実装すること__getattr__
です。彼らがすることは、辞書をチェックし、__swig_set/getmethods__
見つかった場合は値を返すことだけです。これが、「num」のようなメンバーが試行時に返されない理由dir(test)
です。
__dir__
理想的には、swigがそのクラスごとにを実装できれば素晴らしいでしょう。このようなものをすべてのswigラッパークラスに追加できます。
# Merge the two method dictionaries, and get the keys
__swig_dir__ = dict(__swig_getmethods__.items() + __swig_setmethods__.items()).keys()
# Implement __dir__() to return it plus all of the other members
def __dir__(self):
return __dict__.keys() + __swig_dir__
私の質問:
- 非関数メンバーも返すようにdir()関数を取得する簡単な方法はありますか?
- 1の答えが「いいえ」の場合、swigが生成するすべてのPythonクラスに上記のコードを追加する簡単な方法はありますか?
これは些細なことですが、タブ補完は生産性に非常に良い影響を与えると思います。
ありがとう