如何使用 SWIG 在 Python 中将 operator<< 包装到 __str__?
Posted
技术标签:
【中文标题】如何使用 SWIG 在 Python 中将 operator<< 包装到 __str__?【英文标题】:How do I wrap the operator<< to __str__ in Python using SWIG? 【发布时间】:2017-03-16 17:23:02 【问题描述】:如果我想在 C++ 中打印有关对象的信息,我将使用 outstream 运算符<<
:
class Foo
public:
friend std::ostream& operator<<(std::ostream& out, const Foo& foo);
private:
double bar = 7;
;
inline std::ostream& operator<<(std::ostream& out, const Foo& foo)
return out << foo.bar;
然后,我可以做Foo foo; std::cout << foo << std::endl;
。 Python 中的等价物是实现__str__
,然后说print(foo)
。但由于操作员并不是Foo
的真正成员,我不知道如何在 SWIG 中执行此操作。
我必须在我的接口文件中写什么才能重用我的 outstream 运算符的实现以用于print()
?
此外,是否可以让 SWIG 自动重定向对象的 shared_ptr
,这样如果我在某处返回 std::shared_ptr<Foo>
,我仍然可以调用 print(sharedPtrToFoo)
,它会调用 __str__
或 @ 987654333@指向的对象?
【问题讨论】:
这似乎相关:***.com/questions/25199233/… 【参考方案1】:假设您没有使用 `-builtin',这样的事情应该可以工作:
%extend Foo
std::string __str__() const
std::ostringstream out;
out << *$self;
return out.str();
请注意,这与this answer 基本相似,但建议使用std::string
而不是const char *
,以消除一个细微的错误。
关于shared_ptr
,应该是Foo
的每个方法都与shared_ptr<Foo>
透明地公开,所以我希望它能够正常工作。
【讨论】:
像魅力一样工作。谢谢。 很好,谢谢。它回答了所提出的问题,但有些人可能会发现另外一个纯 Python 点很有用:如果您希望 print 函数在例如映射对象在列表中,然后将运算符 __repr__ 而不是__str__
。除非你有充分的理由区分 __str__
和 __repr__
,否则定义后者,前者会默认调用它。以上是关于如何使用 SWIG 在 Python 中将 operator<< 包装到 __str__?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python
如何在 Python 中将“托管缓冲区”转换为 Callable
如何使用 swig C++ 命名空间作为 python 模块公开