我一直repr
在用 Python 阅读。我想知道输出的应用是什么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>'
or感兴趣'<__main__.A instance at 0x74d78>'
?
从理论上讲,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__
例如,您可能有两个 class 实例A
。如果它们具有相同的内存地址,那么您就会知道它们“指向”相同的底层对象。(请注意,此信息也可以使用 获取id
)。
的主要目的repr()
是在交互式解释器和调试器中使用它来以人类可读的形式格式化对象。您提供的示例主要用于调试目的。