8

私はそれを観察しました

help

Python repl では、次のようになります。

Type help() for interactive help, ...

そして、タイプするとき

help()

1つはヘルプモードに追い込まれます。これは、site._Helper__repr__()が(最初の例で) と(2 番目の例で) を定義しているためだと確信して__call__() います。

私はこの動作 (オブジェクトと呼び出し可能な構文のみを求めるプロンプト) が好きで、SWIG 経由で Python にエクスポートする C++ クラスに対しても同じことをしたいと考えています。ここに私がやろうとしたことの簡単な例があります

helpMimic.h
-----------
class HelpMimic
{
public:
    HelpMimic() {};
    ~HelpMimic() {};

    char *__repr__();
    void operator()(const char *func=NULL);
};

helpMimic.cxx
-------------
char *HelpMimic::__repr__()
{
    return "Online help facilities are not yet implemented.";
}

void HelpMimic::operator()(const char *func)
{
    log4cxx::LoggerPtr transcriptPtr = oap::getTranscript();
    std::string commentMsg("# Online help facilities are not yet implemented. Cannot look up ");
    if (func) {
        commentMsg += func;
    }
    else {
        commentMsg += "anything.";
    }

    LOG4CXX_INFO(transcriptPtr, commentMsg);
}

helpMimic.i
-----------
%module sample
 %{
#include <helpMimic.h>
 %}
class HelpMimic
{
public:
    HelpMimic() {};
    ~HelpMimic() {};

    char *__repr__();
    void operator()(const char *func=NULL);
};

アプリケーションでこのクラスを使用しようとすると、ヘルプが表示されている動作が得られないようです(以下の出力は、Python が埋め込まれた C++ アプリケーションから取得され、各入力行が を介して送信されますPyEval_String())。

 tam = sample.HelpMimic()
 tam   # echoes 'tam', nothing else
 print tam
 # _5010b70200000000_p_HelpMimic
 print repr(tam)
 # <Swig Object of type 'HelpMimic *' at 0x28230a0>
 print tam.__repr__()
 # Online help facilities are not yet implemented.

その最後の印刷は、メソッド__repr__()がそこにあることを示していますが、より単純なオブジェクト参照または を使用して見つけることができませんrepr(tam)。また、どちらが呼び出されるかを誤解していたことを期待して定義しようと__str()__しましたが、それでもうまくいきませんでした。

%extendインターフェイス ファイルのディレクティブを使用して、__str__()または__repr__()定義を C++ で直接定義する代わりに、SWIG インターフェイス定義ファイルに挿入しようとしましたが、役に立ちませんでした。

私は何が欠けていますか?

4

2 に答える 2

3

私は通常、%extend 機能を使用して、C/C++ を特定のターゲット言語に合わせすぎないようにしています。例えば

%extend MyClass {
  %pythoncode %{
    def __repr__(self):
      # How you want your object to be shown
    __swig_getmethods__["someMember"] = SomeMemberGet
    __swig_setmethods__["someMember"] = SomeMemberSet
    if _newclass:
      someMember = property(SomeMemberGet,SomeMemberSet)
    def show(self):
      # You could possibly visualize your object using matplotlib
  %}
};

repr関数の内部では、基本的に任意の関数を呼び出して、ニーズに合わせて出力をフォーマットできます。さらに、プロパティを追加して、セッターとゲッターにマップする方法を定義できます。

于 2015-08-11T11:06:49.083 に答える