【问题标题】:Understanding repr( ) function in Python理解 Python 中的 repr() 函数
【发布时间】:2014-04-24 07:45:30
【问题描述】:

repr(): 对象的可评估字符串表示(可以“eval()” 它,这意味着它是一个字符串表示形式,计算结果为 Python 对象)

换句话说:

>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  1. 为什么我在执行repr(x) 时会得到双引号? (我不明白他们 当我这样做时str(x))
  2. 为什么当我执行eval("'foo'") 时得到'foo' 而不是x 对象?

【问题讨论】:

    标签: python repr


    【解决方案1】:

    1) repr('foo') 的结果是 字符串 'foo'。在您的 Python shell 中,表达式的结果也表示为一种表示形式,因此您实际上看到的是repr(repr('foo'))

    2) eval 计算表达式的结果。结果总是一个(例如一个数字、一个字符串或一个对象)。多个变量可以引用同一个值,如:

    x = 'foo'
    y = x
    

    x 和 y 现在指的是同一个值。

    3) 我不明白你在这里的意思。您能否发布一个示例,以及您希望看到的内容?

    【讨论】:

      【解决方案2】:

      您在交互式解释器上获得的反馈也使用repr。当你输入一个表达式时(让它是expr),解释器基本上是result = expr; if result is not None: print repr(result)。因此,您示例中的第二行 将字符串 foo 格式化为您想要的表示形式 ('foo')。然后解释器创建 thatrepresentation,给你留下双引号。

      为什么当我将 %r 与双引号和单引号转义组合并打印出来时,它会以我在 .py 文件中写入的方式打印,而不是我希望看到的方式?

      我不确定你在这里问什么。文本single ' and double " quotes 贯穿repr 时,包含一种引用的转义。当然可以,否则它不会是 Python 规则的有效字符串文字。这正是您致电repr 所要求的。

      还要注意eval(repr(x)) == x 的类比并不是字面意思。这是一个近似值,适用于大多数(所有?)内置类型,但主要是通过查看 repr 输出,您可以很好地了解类型和逻辑“值”。

      【讨论】:

      • 最初,它实际上 是字面意思:每个值的 repr 应该是可以传递给 eval 的东西(或者复制并粘贴到您的源代码中)代码)来产生一个相等的值,或者当你尝试时会引发一个 SyntaxError 的东西(通常是 object.__repr__ 产生的 <…> 样式)。多年来,这种情况逐渐淡化,到 2.7 和 3.x 时,“对于许多类型”才是正确的,即使在 stdlib 中也有例外(例如,作为本地创建的 namedtuple 类型将为您提供repr 你不能eval),但这是最初的想法。
      【解决方案3】:

      当你说

      foo = 'bar'
      baz(foo)
      

      您没有将foo 传递给baz 函数。 foo 只是一个用于表示值的名称,在本例中为 'bar',并且该值被传递给 baz 函数。

      【讨论】:

        【解决方案4】:
        >>> x = 'foo'
        >>> x
        'foo'
        

        所以名称x 附加到'foo' 字符串。例如,当您调用repr(x) 时,解释器会输入'foo' 而不是x,然后调用repr('foo')

        >>> repr(x)
        "'foo'"
        >>> x.__repr__()
        "'foo'"
        

        repr 实际上调用了x 的魔术方法__repr__,它给出了字符串,其中包含分配给'foo' 的值'foo' 的表示形式。所以它在字符串"" 中返回'foo',结果是"'foo'"repr 的想法是给出一个包含一系列符号的字符串,我们可以在解释器中输入这些符号并获得作为参数发送给 repr 的相同值。

        >>> eval("'foo'")
        'foo'
        

        当我们调用eval("'foo'")时,和我们在解释器中输入'foo'是一样的。就像我们直接在解释器中输入外层字符串""的内容一样。

        >>> eval('foo')
        
        Traceback (most recent call last):
          File "<pyshell#5>", line 1, in <module>
            eval('foo')
          File "<string>", line 1, in <module>
        NameError: name 'foo' is not defined
        

        如果我们调用eval('foo'),它与我们在解释器中输入foo 是一样的。但是没有可用的foo 变量并且引发了异常。

        >>> str(x)
        'foo'
        >>> x.__str__()
        'foo'
        >>> 
        

        str 只是对象的字符串表示(记住,x 变量指的是'foo'),所以这个函数返回字符串。

        >>> str(5)
        '5'
        

        整数5的字符串表示为'5'

        >>> str('foo')
        'foo'
        

        而字符串'foo'的字符串表示是同一个字符串'foo'

        【讨论】:

        • 您能否告诉我们一些应该使用 repr 函数的用例。我无法理解
        【解决方案5】:

        str() 用于为最终用户创建输出,而repr() 用于在开发期间进行调试。它是对象的官方表示。

        例子:

        >>> import datetime
        >>> today = datetime.datetime.now()
        >>> str(today)
        '2018-04-08 18:00:15.178404'
        >>> repr(today)
        'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'
        

        从输出中我们看到repr() 显示了日期对象的官方表示。

        【讨论】:

          猜你喜欢
          • 2014-01-20
          • 2014-09-13
          • 2013-10-20
          • 2018-04-10
          • 2017-12-14
          • 1970-01-01
          • 2015-02-12
          相关资源
          最近更新 更多