了解python中的repr()函数

Understanding repr( ) function in Python

repr():对象的可计算字符串表示形式(can"eval()"它,意味着它是一个字符串表示,计算结果是一个python对象)

换言之:

1
2
3
>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  • 为什么我做repr(x)时会得到双引号?(我不明白)当我这样做的时候
  • 当我做eval("'foo'")时为什么要得到'foo',而不是x,那是对象?

  • 1
    2
    3
    >>> x = 'foo'
    >>> x
    'foo'

    因此,名称x附加到'foo'字符串。例如,当您调用repr(x)时,解释器将'foo'替换为x,然后调用repr('foo')

    1
    2
    3
    4
    >>> repr(x)
    "'foo'"
    >>> x.__repr__()
    "'foo'"

    repr实际上调用了x的神奇方法__repr__,它给出了包含分配给x的值'foo'表示的字符串。因此,它返回字符串""中的'foo',导致"'foo'"repr的思想是给出一个字符串,该字符串包含一系列符号,我们可以在解释器中键入这些符号,并获得作为参数发送给repr的相同值。

    1
    2
    >>> eval("'foo'")
    'foo'

    当我们调用eval("'foo'")时,它与我们在解释器中键入'foo'相同。就像我们在解释器中直接键入外部字符串""的内容一样。

    1
    2
    3
    4
    5
    6
    7
    >>> 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变量,因此引发了异常。

    1
    2
    3
    4
    5
    >>> str(x)
    'foo'
    >>> x.__str__()
    'foo'
    >>>

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

    1
    2
    >>> str(5)
    '5'

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

    1
    2
    >>> str('foo')
    'foo'

    字符串'foo'的字符串表示与字符串'foo'相同。


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

    Why when I combine %r with double-quote and single quote escapes and print them out, it prints it the way I'd write it in my .py file but not the way I'd like to see it?

    我不知道你在问什么。文本single ' and double" quotes在遍历repr时,包括一种引用的转义。当然可以,否则它就不是python规则中的有效字符串了。这正是你打电话给repr所要求的。

    还要注意的是,eval(repr(x)) == x的类比并不是字面上的。这是一个近似值,对大多数人(全部?)都适用。内置类型,但最主要的是,通过查看repr输出,您对类型和逻辑"值"有了相当好的了解。


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

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

    1
    2
    x = 'foo'
    y = x

    x和y现在指的是相同的值。

    3)我不知道你在这里是什么意思。你能举个例子吗?你想看什么?


    str()用于为最终用户创建输出,repr()用于调试开发,它代表对象的官方。

    例子:

    1
    2
    3
    4
    5
    6
    >>> 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()显示了日期对象的官方表示。


    当你说

    1
    2
    foo = 'bar'
    baz(foo)

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