repr的输出何时有用?

时间:2011-01-11 19:42:53

标签: python repr

我一直在阅读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>'感兴趣?

3 个答案:

答案 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-8cp1252),因此会产生不同的结果。

相反,字符串的repr是明确的:

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

当人们在这里发布有关Python字符串的问题时,他们经常被要求显示字符串的repr,以便我们确切知道他们正在处理什么字符串。

通常,repr应该是对象的明确字符串表示。 repr(obj)调用对象obj的{​​{1}}方法。由于在您的示例中,类__repr__没有自己的A方法,因此__repr__会指示类和内存地址。

您可以覆盖repr(b)方法以提供更多相关信息。


在您的示例中,__repr__告诉我们两件有用的事情:

  1. '<__main__.A instance at 0x74d78>'是类b的实例 在A 命名空间,
  2. 并且该对象位于 内存地址为0x74d78。
  3. 例如,您可能有两个类__main__的实例。如果它们具有相同的内存地址,那么您就知道它们“指向”同一个底层对象。 (注意,此信息也可以使用A)获得。

答案 2 :(得分:1)

repr()的主要目的是在交互式解释器和调试器中使用它来以人类可读的形式格式化对象。您提供的示例主要用于调试目的。