Python repr 函数
上次修改时间:2025 年 4 月 11 日
本全面指南探讨 Python 的 repr
函数,该函数返回对象的字符串表示形式。我们将涵盖基本用法、自定义对象以及创建明确对象表示形式的实用示例。
基本定义
repr
函数返回一个包含对象可打印表示形式的字符串。它的目的是明确无误,并且通常看起来像有效的 Python 代码,可以重新创建该对象。
主要特点:用于调试,通常返回有效的 Python 代码,在容器中打印对象时由 Python 使用,并调用对象的 __repr__
方法。
基本用法与内置类型
以下是与不同内置类型的简单用法,显示了 repr
如何创建常见 Python 对象的字符串表示形式。
# With numbers print(repr(42)) # '42' print(repr(3.14)) # '3.14' # With strings print(repr('hello')) # "'hello'" print(repr("world")) # '"world"' # With containers print(repr([1, 2, 3])) # '[1, 2, 3]' print(repr({'a': 1})) # "{'a': 1}"
此示例显示了 repr
与不同内置类型的使用。对于数字,它将数字作为字符串返回。对于字符串,它会添加引号。
字符串表示形式包括引号本身,使其清楚地表明它是一个字符串。对于容器,它显示了重新创建它们的完整语法。
repr 和 str 之间的区别
此示例演示了对象的 repr
和 str
表示形式之间的主要区别。
import datetime now = datetime.datetime.now() print(str(now)) # '2025-04-11 14:30:15.123456' print(repr(now)) # 'datetime.datetime(2025, 4, 11, 14, 30, 15, 123456)' class Example: def __str__(self): return "User-friendly string" def __repr__(self): return "Example()" e = Example() print(str(e)) # 'User-friendly string' print(repr(e)) # 'Example()'
datetime 示例显示 str
提供了一种可读的格式,而 repr
显示了如何重新创建对象。自定义类显示了相同的区别。
repr
专为开发人员设计,而 str
专为最终用户设计。 打印容器时,Python 对元素使用 repr
。
带有 __repr__ 的自定义对象
您可以通过实现 __repr__
特殊方法来使自定义对象与 repr
正确配合使用。
class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"Point({self.x}, {self.y})" def __str__(self): return f"({self.x}, {self.y})" p = Point(3, 4) print(repr(p)) # 'Point(3, 4)' print(str(p)) # '(3, 4)' print([p]) # [Point(3, 4)]
Point 类同时实现了 __repr__
和 __str__
。 repr
显示了如何重新创建对象,而 str
显示了一个简化的版本。
当点位于列表中时,Python 使用 repr
来表示它,这证明了为什么 __repr__
很重要。
使用 repr 调试
此示例显示了 repr
如何通过提供更详细的对象信息来用于调试。
data = { 'name': 'Alice', 'age': 30, 'scores': [95, 88, 92], 'active': True } print("Debug output:") print(repr(data)) # Output shows the complete structure with types: # {'name': 'Alice', 'age': 30, 'scores': [95, 88, 92], 'active': True} user_input = "Hello\nWorld" print("User input representation:") print(repr(user_input)) # Shows the newline character: 'Hello\nWorld'
字典示例显示了 repr
如何显示完整的结构,其中所有类型都可见。 这对于调试非常宝贵。
字符串示例演示了 repr
如何使特殊字符可见,这与常规打印不同,后者将显示实际的换行符。
错误处理
虽然 repr
通常适用于所有对象,但此示例显示了边缘情况以及如何处理它们。
class BadRepr: def __repr__(self): raise Exception("Broken repr") try: print(repr(BadRepr())) except Exception as e: print(f"Error in repr: {e}") # Default repr behavior class NoRepr: pass print(repr(NoRepr())) # Shows default object representation
第一个示例显示了当 __repr__
引发异常时会发生什么。 第二个示例显示了未定义 __repr__
时的默认表示形式。
默认表示形式包括类名和内存地址,这总比没有好,但不如自定义实现有用。
最佳实践
- 实现 __repr__: 对于您创建的所有类
- 使其明确: 表示形式应清楚地显示对象状态
- 以可重新创建为目标: 理想的 repr 是有效的 Python 代码,可以重新创建对象
- 包括所有状态: 不要省略重要的属性
- 与 str 区分开: repr 供开发人员使用,str 供用户使用
资料来源
作者
列出所有 Python 教程。