我一直在阅读Python中的repr
。我想知道repr
的输出的应用是什么。 e.g。
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>'
感兴趣?
答案 0 :(得分:5)
理论上,repr(obj)
应该吐出一个字符串,以便可以将其输入eval
以重新创建对象。换句话说,
obj2 = eval(repr(obj1))
应该重现该对象。
在实践中,repr
通常是str
的“精简”版本。 str
可能会打印一个人类可读的对象形式,而repr
会打印出类似对象类的信息,通常用于调试目的。但是,有用性在很大程度上取决于您的情况以及相关对象如何处理repr
。
答案 1 :(得分:4)
有时您必须处理或present a byte string,例如
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
的{{1}}方法。由于在您的示例中,类__repr__
没有自己的A
方法,因此__repr__
会指示类和内存地址。
您可以覆盖repr(b)
方法以提供更多相关信息。
在您的示例中,__repr__
告诉我们两件有用的事情:
'<__main__.A instance at 0x74d78>'
是类b
的实例
在A
命名空间,例如,您可能有两个类__main__
的实例。如果它们具有相同的内存地址,那么您就知道它们“指向”同一个底层对象。 (注意,此信息也可以使用A
)获得。
答案 2 :(得分:1)
repr()
的主要目的是在交互式解释器和调试器中使用它来以人类可读的形式格式化对象。您提供的示例主要用于调试目的。