当前位置: 首页 > news >正文

Python 错误 TypeError: __str__ Returned Non-String but Printing Output

本文旨在解决当我们尝试打印字符串而不是在函数中使用 return 语句时出现的问题。


Python 返回非字符串错误但打印输出

以下代码显示了 TypeError: str returned non-string,但它仍然打印输出。

示例代码:

class xy:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):print('X={0}, Y={1}')if __name__ == "__main__":x_y = xy('value of x is 1','value of y is 2')print(x_y)

输出:

TypeError                                 Traceback (most recent call last)
<ipython-input-1-7b40a083df6c> in <module>10 if __name__ == "__main__":11     x_y = xy('value of x is 1','value of y is 2')
---> 12     print(x_y)TypeError: __str__ returned non-string (type NoneType)

为什么我们会收到错误,即 __str__ 返回非字符串(类型 NoneType)? 首先,我们需要了解 __str__ 运算符的工作原理。

__str__ 运算符主要用于返回字符串,但我们主要使用它来打印字符串。 Python 中的 __str__ 有两个术语,可互换使用,运算符或 Dunder 方法。

上述代码中,__str__方法直接调用了print()函数,打印了字符串,但没有返回字符串; 这就是它显示上述错误的原因。

此外,我们的 __str__ 运算符打印字符串并且不返回任何内容; 这就是为什么它错误地使用 None 的原因。


解决 TypeError: __str__ Returned Non-String

我们可以使用 __str__ 方法中的 return 语句来解决这个问题。 所以,我们必须在 __str__ 方法中返回字符串而不是打印它。 请参见以下代码。

示例代码:

class xy:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return ('X={0}, Y={1}').format(self.x, self.y)if __name__ == "__main__":x_y = xy('value of x is 1','value of y is 2')print(x_y)  

输出:

X=value of x is 1, Y=value of y is 2

上面的代码还有一个问题。 问题是,如果我们返回的值不是字符串,它会显示确切的错误,但这次,变量类型不是 None。

示例代码:

class xy:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return 123if __name__ == "__main__":x_y = xy('value of x is 1','value of y is 2')print(x_y) 

输出:

TypeError                                 Traceback (most recent call last)
<ipython-input-9-173c41d63dab> in <module>12 if __name__ == "__main__":13     x_y = xy('value of x is 1','value of y is 2')
---> 14     print(x_y)TypeError: __str__ returned non-string (type int)

为了解决这个问题,我们需要对值进行类型转换并用 str() 方法包装它,这意味着将变量的类型转换为字符串,因为这是 str() 方法的要求。

示例代码:

class xy:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return str(123)if __name__ == "__main__":x_y = xy('value of x is 1','value of y is 2')print(x_y)  

输出:

123

现在,代码针对所有可能的情况运行,因为我们解决了所有预期的问题并满足 str 方法的要求,即它只返回字符串值。


__str__ 使用 __repr__() 返回非字符串

__repr__() 方法与 str 方法做同样的事情。 请参见以下代码。

示例代码:

class calculate(object):def __init__(self, x, y, z):self.x = xself.y = yself.z = zdef __repr__(self):print ("(%r, %r, %r)" %(self.x, self.y, self.z))equation = calculate(1, 2, 3)
print(equation) 

输出:

(1, 2, 3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-0ee74d4c74c8> in <module>8 9 equation = calculate(1, 2, 3)
---> 10 print(equation)TypeError: __str__ returned non-string (type NoneType)

上面的代码还打印了字符串,而不是从 __repr__() 方法返回它。 因此,我们可以使用 return 语句来解决它,而不是使用 __repr__() 方法打印字符串。

示例代码:

class calculate(object):def __init__(self, x, y, z):self.x = xself.y = yself.z = zdef __repr__(self):return str("(%r, %r, %r)" %(self.x, self.y, self.z))equation = calculate(1, 2, 3)
print(equation)   

输出:

(1, 2, 3)

相关文章:

  • Redis中缓存穿透、击穿、雪崩以及解决方案
  • PHP如何实现邮箱验证
  • 如何解决ajax浏览器缓存
  • 微信小程序保存二维码的过程
  • 构建第一个ArkTS应用(纯HarmonyOS应用)
  • 打印菱形图案C语言
  • C++服务器 支持http、tcp protobuf、websocket,linux开源框架 零依赖轻松编译部署 Reactor
  • SCAU:前一个和后一个字符
  • JAVA代码优化:Easy Excel(操作Excel文件的开源工具)
  • 基于ssm Vue的戒烟网站源码和论文
  • 实时流式计算 kafkaStream
  • 【算法思考记录】力扣2653. 滑动子数组的美丽值【C++,滑动窗口】
  • 【算法】希尔排序
  • HR看好的字符函数和字符串处理函数!!!
  • [MySQL]日期和时间函数
  • Android Volley源码解析
  • co模块的前端实现
  • ES6 学习笔记(一)let,const和解构赋值
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript 原型链
  • JavaScript函数式编程(一)
  • Java知识点总结(JavaIO-打印流)
  • MySQL的数据类型
  • node学习系列之简单文件上传
  • 程序员该如何有效的找工作?
  • 读懂package.json -- 依赖管理
  • 机器学习学习笔记一
  • 记一次和乔布斯合作最难忘的经历
  • 记一次删除Git记录中的大文件的过程
  • 聊聊directory traversal attack
  • 聊聊sentinel的DegradeSlot
  • 前端
  • 小程序测试方案初探
  • 正则表达式-基础知识Review
  • # Java NIO(一)FileChannel
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • $.ajax中的eval及dataType
  • (5)STL算法之复制
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (待修改)PyG安装步骤
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (力扣题库)跳跃游戏II(c++)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net MVC4 上传大文件,并保存表单
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net分布式压力测试工具(Beetle.DT)
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET命名规范和开发约定
  • .sh 的运行