我观察到,当一种类型
help
在 Python repl 中,一个得到
Type help() for interactive help, ...
当一种类型
help()
一个被踢到帮助模式。我很确定这是因为site._Helper定义了__repr__()
(对于第一个示例)和__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__()
定义插入到 SWIG 接口定义文件中,而不是直接在 C++ 中定义它们,但无济于事。
我错过了什么?