SWIG封装Python时__repr__函数返回非字符串错误的解决方法
修复SWIG封装中__repr__返回SwigPyObject的错误
这个错误的核心是SWIG未正确将C++的std::string转换为Python原生字符串对象,导致返回了SWIG内部的SwigPyObject,不符合Python对__repr__方法返回str类型的要求。以下是两种可行的修复方案:
方案一:显式构造并返回Python字符串对象
直接调用Python C API生成字符串对象,绕过std::string的转换问题,同时修正你代码中attr2取值的笔误:
%module myModule %{ #include <string> #include <sstream> #include <Python.h> %} %extend myClass { PyObject* __repr__() { std::ostringstream ss; ss << "MyClass(attr1=" << $self->attr1 << ", attr2=" << $self->attr2 << ")"; // 根据Python版本返回对应类型的字符串对象 #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromString(ss.str().c_str()); #else return PyString_FromString(ss.str().c_str()); #endif }}
方案二:让SWIG自动处理std::string转换
通过导入SWIG标准库中的std_string.i,让SWIG自动完成C++ std::string到Python字符串的转换,写法更简洁:
%module myModule %{ #include <string> #include <sstream> %} // 导入std_string模块,启用std::string与Python字符串的自动转换 %include <std_string.i> %extend myClass { std::string __repr__() { std::ostringstream ss; ss << "MyClass(attr1=" << $self->attr1 << ", attr2=" << $self->attr2 << ")"; // 修正笔误 return ss.str(); }}
额外注意
你的原始代码中存在笔误:输出attr2时错误使用了$self->attr1,这会导致attr2的取值和attr1完全一致,两种方案中都已修正该问题。
内容的提问来源于stack exchange,提问作者Thombou
相关产品推荐
相关产品推荐

