0

0

Python repr 与 str 的设计原则

舞姬之光

舞姬之光

发布时间:2026-02-17 15:53:02

|

448人浏览过

|

来源于php中文网

原创

repr 应返回可被 eval 执行或清晰还原对象构造的字符串,优先用关键字参数格式展示关键属性;str 侧重人类可读性,二者在容器中递归调用规则不同,缺失 repr 会严重损害调试效率。

python repr 与 str 的设计原则

repr 应该返回可被 eval 执行的字符串

这是 repr 最核心的设计意图:生成一个“能还原出原对象”的字符串表示,理想情况下可以直接喂给 eval() 重建对象。比如 repr("hello") 返回 '"hello"'(带引号),而 str("hello") 只返回 hello(不带引号)。

实际开发中容易忽略这点,导致自定义类的 __repr__ 返回了无上下文的描述(如 "<user object>"</user>),调试时完全看不出字段值。

  • 优先包含关键属性,用关键字参数风格: User(name="alice", age=30)
  • 避免省略、模糊表述(如 "User(…)""User instance"
  • 若对象不可安全 eval(比如含函数、文件句柄),至少保证字段名+值清晰可读,不加引号反而容易误判类型

str 是给人看的,repr 是给程序员/系统看的

str 的目标是可读性与语义友好,比如 datetime 对象的 str() 输出 "2024-05-22 14:30:00";而 repr() 会带上模块路径和完整构造参数:datetime.datetime(2024, 5, 22, 14, 30, 0)

这个分工一旦颠倒,就会在日志、调试器或 print() 中造成困惑——比如把 repr 当成用户界面输出,结果看到一串带引号和转义的字符串。

立即学习Python免费学习笔记(深入)”;

Heeyo
Heeyo

Heeyo:AI儿童启蒙陪伴师,风靡于硅谷的儿童AI导师和玩伴

下载
  • str 可以省略技术细节(如编码、内存地址),但必须保持语义准确
  • repr 不必考虑换行或长度,宁长勿缺;str 可适当截断或格式化(如 Path 对象的 str() 返回纯路径字符串,不带 PosixPath(...) 包装)
  • 交互式环境(如 IPython)默认调用 repr 显示结果,不是 str —— 这是很多人误以为 “print 和直接敲变量效果一样” 的根源

自定义类里漏写 __repr__ 就等于放弃调试效率

如果只实现 __str__ 而没写 __repr__,Python 会 fallback 到默认的 <__main__.myclass object at></__main__.myclass>,所有字段信息彻底丢失。这时候 logging.debug("user: %r", user)pprint([user1, user2]) 都毫无意义。

更隐蔽的问题是:某些库(如 dataclassesattrs)默认生成的 __repr__ 虽然可用,但可能包含你不希望暴露的字段(如密码哈希、内部缓存),需要显式覆盖。

  • 哪怕只是临时调试,也建议第一行就补上 def __repr__(self): return f"{self.__class__.__name__}({self.__dict__})"
  • 生产代码中,用 dataclass(repr=True) 是安全起点,但记得检查字段是否都该暴露
  • 避免在 __repr__ 里触发副作用(如访问数据库、计算耗时属性),它可能被日志框架、IDE 变量面板等非预期调用

repr 和 str 在容器里的行为差异常被低估

列表、字典等容器在调用 repr 时,会递归使用元素的 repr;而 str 容器则调用元素的 str。这意味着:如果你的自定义类只有 __str__,放进 list 后用 print(my_list) 看到的是友好的字符串,但用 logging.info("%r", my_list) 就又变回 <myclass object at ...></myclass>

这种不一致在序列化、日志采样、单元测试断言里特别容易踩坑——比如你 assert str(obj) == "ok" 通过了,但 assert repr(obj) == "ok" 必然失败,因为类型根本不匹配。

  • 容器的 __str____repr__ 行为由其自身实现决定,不继承元素逻辑,但内容渲染依赖元素的对应方法
  • 测试时若用 %r 格式化日志或断言,务必确保所有嵌套对象都有合理 __repr__
  • JSON、YAML 等序列化不走 str/repr,它们有自己的转换协议,别指望重载这两个方法就能控制导出格式

最常被跳过的其实是 repr 的“可逆性”要求:它不一定要真能 eval,但得让开发者一眼看出“这东西是怎么造出来的”。少一个字段、多一个空格、漏掉 None 或空字符串的显式表示,都可能让排查时间翻倍。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

12

2026.02.03

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

553

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

462

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号