讲师中心 微信公众号
AI工具推荐 视频效率加速

Python repr 与 str 的设计原则

夜萱酱_3982

夜萱酱_3982

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

|

488人浏览过

|

来源于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免费学习笔记(深入)”;

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 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]) 都毫无意义。

更隐蔽的问题是:某些库(如 dataclasses、attrs)默认生成的 __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工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

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

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

2215

2023.08.07

json是什么
json是什么

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

3522

2023.08.23

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

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

1176

2023.10.13

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

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

4059

2025.09.10

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

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

3160

2023.09.27

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

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

269

2026.02.03

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

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

1838

2023.08.03

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

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

2904

2023.09.04

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn