何时repr的输出有用?
我最近在研究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 个回答
repr()
的主要作用是在交互式解释器和调试器中,用来把对象格式化成人类可以理解的形式。你提到的例子主要是为了调试方便。
理论上,repr(obj)
应该返回一个字符串,这个字符串可以用在 eval
中来重新创建这个对象。换句话说,
obj2 = eval(repr(obj1))
应该能再现这个对象。
不过在实际使用中,repr
通常是 str
的一个“简化版”。str
可能会打印出人类易读的对象形式,而 repr
则会输出一些信息,比如对象的类别,通常是为了调试方便。但它的实际用处很大程度上取决于你的具体情况,以及这个对象是如何处理 repr
的。
有时候你需要处理或者展示一个字节字符串,比如说:
bob2='bob\xf0\xa4\xad\xa2'
如果你在Ubuntu上打印这个字符串,你会看到:
In [62]: print(bob2)
bob
这对其他想理解你字节字符串的人来说并没有什么帮助。在评论中,John提到在Windows上,print(bob2)
的结果会是类似于bobð¤¢
的东西。问题在于,Python会根据你终端或控制台的默认编码来解码字节字符串。因为Ubuntu和Windows使用的默认编码不同(可能是utf-8
和cp1252
),所以结果也会不同。
相比之下,字符串的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>'
告诉我们两个有用的信息:
b
是类A
的一个实例,位于__main__
命名空间中,- 而这个对象在内存中的地址是0x74d78。
比如说,你可能有两个类A
的实例。如果它们的内存地址相同,那你就知道它们“指向”的是同一个底层对象。(注意,这个信息也可以通过id
来获取。)