3

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__ 

私の質問:

  1. 非関数メンバーも返すようにdir()関数を取得する簡単な方法はありますか?
  2. 1の答えが「いいえ」の場合、swigが生成するすべてのPythonクラスに上記のコードを追加する簡単な方法はありますか?

これは些細なことですが、タブ補完は生産性に非常に良い影響を与えると思います。

ありがとう

4

1 に答える 1

2

IPythonは、dirをIPython / core/completer.py内の新しい関数dir2にラップします

したがって、dir2を再定義してみることができます。何かのようなもの:

import IPython.core.completer
old_dir = IPython.core.completer.dir2

def my_dir(obj):
    methods = old_dir(obj)
    #merge your swig methods in
    return methods

IPython.core.completer.dir2 = my_dir
于 2012-09-09T23:54:55.877 に答える