5

我一直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>'

4

3 回答 3

5

从理论上讲,repr(obj)应该吐出一个字符串,以便可以将其输入eval以重新创建对象。换句话说,

obj2 = eval(repr(obj1))

应该重现对象。

在实践中,repr通常是str. str可能会打印对象的人类可读形式,而repr打印出对象类等信息,通常用于调试目的。但是有用性在很大程度上取决于您的情况以及相关对象的处理方式repr

于 2011-01-11T19:46:43.510 回答
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 的内存中。

例如,您可能有两个 class 实例A。如果它们具有相同的内存地址,那么您就会知道它们“指向”相同的底层对象。(请注意,此信息也可以使用 获取id)。

于 2011-01-11T19:48:12.507 回答
1

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

于 2011-01-11T19:46:22.697 回答