私はそれを観察しました
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 インターフェイス定義ファイルに挿入しようとしましたが、役に立ちませんでした。
私は何が欠けていますか?