何时repr的输出有用?

5 投票
3 回答
1236 浏览
提问于 2025-04-16 09:47

我最近在研究Python中的repr这个东西。想知道repr输出的结果有什么用,比如说:

class A:
 pass

repr(A) ='<class __main__.A at 0x6f570>'

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'

什么时候会对'<class __main__.A at 0x6f570>'或者'<__main__.A instance at 0x74d78>'这样的内容感兴趣呢?

3 个回答

1

repr()的主要作用是在交互式解释器和调试器中,用来把对象格式化成人类可以理解的形式。你提到的例子主要是为了调试方便。

5

理论上,repr(obj) 应该返回一个字符串,这个字符串可以用在 eval 中来重新创建这个对象。换句话说,

obj2 = eval(repr(obj1))

应该能再现这个对象。

不过在实际使用中,repr 通常是 str 的一个“简化版”。str 可能会打印出人类易读的对象形式,而 repr 则会输出一些信息,比如对象的类别,通常是为了调试方便。但它的实际用处很大程度上取决于你的具体情况,以及这个对象是如何处理 repr 的。

4

有时候你需要处理或者展示一个字节字符串,比如说:

bob2='bob\xf0\xa4\xad\xa2'

如果你在Ubuntu上打印这个字符串,你会看到:

In [62]: print(bob2)
bob

这对其他想理解你字节字符串的人来说并没有什么帮助。在评论中,John提到在Windows上,print(bob2)的结果会是类似于bob𤭢的东西。问题在于,Python会根据你终端或控制台的默认编码来解码字节字符串。因为Ubuntu和Windows使用的默认编码不同(可能是utf-8cp1252),所以结果也会不同。

相比之下,字符串的repr(表示)是明确的:

In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'

当人们在这里提问关于Python字符串的问题时,通常会被要求展示字符串的repr,这样我们就能确定他们在处理什么字符串。

一般来说,repr应该是对象的明确字符串表示。repr(obj)会调用对象obj__repr__方法。因为在你的例子中,类A没有自己的__repr__方法,所以repr(b)就会显示类名和内存地址。

你可以重写__repr__方法,以提供更相关的信息。


在你的例子中,'<__main__.A instance at 0x74d78>'告诉我们两个有用的信息:

  1. b是类A的一个实例,位于__main__命名空间中,
  2. 而这个对象在内存中的地址是0x74d78。

比如说,你可能有两个类A的实例。如果它们的内存地址相同,那你就知道它们“指向”的是同一个底层对象。(注意,这个信息也可以通过id来获取。)

撰写回答