我一直在读 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>' 或者'<__main__.A instance at 0x74d78>'?

有帮助吗?

解决方案

有时您必须处理或 提出字节字符串

bob2='bob\xf0\xa4\xad\xa2'

如果您将其打印出来(在Ubuntu中),您会得到

In [62]: print(bob2)
bob𤭢

这对尝试理解您的字节字符串的其他人并不是很有帮助。在评论中,约翰指出,在窗户中, print(bob2) 导致类似 bob𤭢. 。问题在于Python检测终端/控制台的默认编码,并试图根据该编码来解码字节字符串。由于Ubuntu和Windows使用不同的默认编码(可能 utf-8cp1252 分别),随后发生了不同的结果。

相反,字符串的重复是明确的:

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

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

通常,reper应该是对象的明确字符串表示。 repr(obj) 调用对象 obj' __repr__ 方法。因为在您的示例中 A 没有自己的 __repr__ 方法, repr(b) 诉诸指示类和内存地址。

你可以覆盖 __repr__ 提供更多相关信息的方法。


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

  1. b 是类的实例 A在里面 __main__名称空间,
  2. 并且该对象位于地址0x74d78的内存中。

例如,您可能有两个课程实例 A. 。如果它们具有相同的内存地址,那么您会知道它们正在“指向”同一基础对象。 (请注意此信息也可以使用 id).

其他提示

理论上, repr(obj) 应该吐出一根绳子,以便可以喂入 eval 重新创建对象。换句话说,

obj2 = eval(repr(obj1))

应该复制物体。

在实践中, repr 通常是一个“精简版”版本 str. str 可能会打印物体的可读形式,而 repr 打印出诸如对象类之类的信息,通常用于调试目的。但是,有用性在很大程度上取决于您的情况以及所讨论的对象如何处理 repr.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top