如何使用 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 运算符&lt;&lt;

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 &lt;&lt; foo &lt;&lt; std::endl;。 Python 中的等价物是实现__str__,然后说print(foo)。但由于操作员并不是Foo 的真正成员,我不知道如何在 SWIG 中执行此操作。

我必须在我的接口文件中写什么才能重用我的 outstream 运算符的实现以用于print()

此外,是否可以让 SWIG 自动重定向对象的 shared_ptr,这样如果我在某处返回 std::shared_ptr&lt;Foo&gt;,我仍然可以调用 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&lt;Foo&gt; 透明地公开,所以我希望它能够正常工作。

【讨论】:

像魅力一样工作。谢谢。 很好,谢谢。它回答了所提出的问题,但有些人可能会发现另外一个纯 Python 点很有用:如果您希望 print 函数在例如映射对象在列表中,然后将运算符 __repr__ 而不是 __str__。除非你有充分的理由区分 __str____repr__,否则定义后者,前者会默认调用它。

以上是关于如何使用 SWIG 在 Python 中将 operator<< 包装到 __str__?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python

在 SWIG 中将结构从 C++ 函数返回到 Python

如何在 Python 中将“托管缓冲区”转换为 Callable

如何使用 swig C++ 命名空间作为 python 模块公开

在 Windows 中将 SWIG 生成的文件构建到 DLL 中

带有 SWIG 的 C++ 数组到 Numpy 的 TypeError 问题