You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:40:49