repr的输出何时有用?

sha*_*haz 5 python repr

我一直在阅读reprPython.我想知道输出的应用是什么repr.例如

class A:
 pass

repr(A) ='<class __main__.A at 0x6f570>'

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
Run Code Online (Sandbox Code Playgroud)

什么时候会对'<class __main__.A at 0x6f570>'或感兴趣'<__main__.A instance at 0x74d78>'

mip*_*adi 5

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

obj2 = eval(repr(obj1))
Run Code Online (Sandbox Code Playgroud)

应该重现该对象.

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


unu*_*tbu 4

有时您必须处理或呈现字节字符串,例如

\n\n
bob2=\'bob\\xf0\\xa4\\xad\\xa2\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你打印出来(在 Ubuntu 中)你会得到

\n\n
In [62]: print(bob2)\nbob\n
Run Code Online (Sandbox Code Playgroud)\n\n

这对于其他试图理解您的字节字符串的人来说并不是很有帮助。John 在评论中指出,在 Windows 中,print(bob2)会产生类似bob\xc3\xb0\xc2\xa4\xc2\xad\xc2\xa2. 问题是 Python 检测终端/控制台的默认编码,并尝试根据该编码解码字节字符串。由于 Ubuntu 和 Windows 使用不同的默认编码(可能utf-8分别cp1252),因此会产生不同的结果。

\n\n

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

\n\n
In [63]: print(repr(bob2))\n\'bob\\xf0\\xa4\\xad\\xa2\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

一般来说,repr 应该是对象的明确字符串表示。repr(obj)调用对象obj__repr__方法。由于在您的示例中,该类A没有自己的__repr__方法,repr(b)因此只能指示类和内存地址。

\n\n

您可以重写该__repr__方法以提供更多相关信息。

\n\n
\n\n

在您的示例中,\'<__main__.A instance at 0x74d78>\'告诉我们两件有用的事情:

\n\n
    \n
  1. 这是命名空间中\nb类的实例,A__main__
  2. \n
  3. 并且该对象驻留在内存中的地址 0x74d78 处。
  4. \n
\n\n

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

\n