【问题标题】:When is the output of repr useful?repr 的输出什么时候有用?
【发布时间】:2011-06-07 09:44:08
【问题描述】:

我一直在阅读有关 Python 中的 repr 的信息。我想知道repr 的输出的应用是什么。例如

class A:
 pass

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

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'

什么时候会对'&lt;class __main__.A at 0x6f570&gt;''&lt;__main__.A instance at 0x74d78&gt;' 感兴趣?

【问题讨论】:

    标签: python repr


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      obj2 = eval(repr(obj1))
      

      应该重现对象。

      实际上,repr 通常是str 的“精简版”。 str 可能会打印出对象的可读形式,而repr 会打印出对象类等信息,通常用于调试目的。但是有用性在很大程度上取决于您的情况以及相关对象如何处理repr

      【讨论】:

      • 刚刚试了一下,我得到了以下结果 >>> obj = eval(repr(w)) Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件“”,第 1 行 <__main__.a instance at> ^ SyntaxError: invalid syntax
      • @shaz:w 是什么?例如,这应该适用于w = 'a string'
      • w 是 A 类的一个实例,即 w = A()
      • @shaz:在您的对象的情况下,它不会输出可以反馈到eval 的字符串。 (这是repr 的初衷,但大部分都被忽略了。)
      【解决方案3】:

      有时你必须处理或present a byte string之类的

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

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

      In [62]: print(bob2)
      bob?
      

      这对于试图理解您的字节字符串的其他人来说不是很有帮助。在 cmets 中,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__ 方法以提供更多相关信息。


      在您的示例中,'&lt;__main__.A instance at 0x74d78&gt;' 告诉我们两个有用的信息:

      1. b 是类A 的一个实例 在__main__ 命名空间,
      2. 并且该对象驻留在 内存地址为 0x74d78。

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

      【讨论】:

      • (0) 请不要在不提及假定/已知编码是什么的情况下谈论字节字符串 (1) 事实上,增加使用 repr() 的原因,并不是每个人都能理解 CJK打印该字符串时显示的字符;在 Windows 上的 IDLE 中,一个得到 bob𤭢 ...它应该在 'bob' 之后有 4 个字符,我在 IDLE 中看到 4,但在这个 SO 评论中我只看到 3;大概 \xAD 被视为软连字符。 (2) 对 unicode 字符串有用,而不仅仅是字节字符串。示例:u'bob\U00024b62'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2015-10-16
      • 2012-08-07
      • 2012-04-05
      • 1970-01-01
      • 2011-09-06
      • 2010-12-26
      相关资源
      最近更新 更多