理解Python中的repr()函数

010*_*amt 137 python repr

repr():对象的可评估字符串表示形式(可以"eval()"它,这意味着它是一个求值为Python对象的字符串表示形式)

换一种说法:

>>> x = 'foo'
>>> repr(x)
"'foo'"
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么我这样做时会得到双引号repr(x)?(当我这样做时,我不会得到它们str(x))
  2. 为什么我'foo'在做的时候会得到eval("'foo'")而不是x那个对象?

ovg*_*vin 159

>>> x = 'foo'
>>> x
'foo'
Run Code Online (Sandbox Code Playgroud)

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

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
Run Code Online (Sandbox Code Playgroud)

repr实际调用一个魔术方法__repr__x,这给包含该值的表示'foo'分配给x.因此,它返回'foo'的字符串中""产生"'foo'".我们的想法repr是给出一个包含一系列符号的字符串,我们可以在解释器中输入这些符号,并获得作为参数发送的相同值repr.

>>> eval("'foo'")
'foo'
Run Code Online (Sandbox Code Playgroud)

当我们打电话时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
Run Code Online (Sandbox Code Playgroud)

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

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 
Run Code Online (Sandbox Code Playgroud)

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

>>> str(5)
'5'
Run Code Online (Sandbox Code Playgroud)

整数字符串5'5'.

>>> str('foo')
'foo'
Run Code Online (Sandbox Code Playgroud)

字符串表示字符串'foo'是相同的字符串'foo'.


小智 10

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

为什么当我将%r与双引号和单引号转义组合并将它们打印出来时,它会按照我在.py文件中编写它的方式打印它,但不是我想看到它的方式?

我不确定你在这里问什么.该文本single ' and double " quotes在运行时repr包含一种引用的转义.当然它确实如此,否则它将不是Python规则的有效字符串文字.这正是你通过电话要求的repr.

还要注意,这个eval(repr(x)) == x比喻并不意味着文字.它是一个近似值,适用于大多数(所有?)内置类型,但主要的是你从repr输出中获得了类型和逻辑"值"的相当好的概念.

  • 最初,它实际上是_was_,意为字面意思:每个值的`repr`应该是可以传递给`eval`的东西(或复制并粘贴到您的源代码中)以产生相等的值,或者会引发SyntaxError尝试时(通常是由object .__ repr__`产生的&lt;&lt; &gt;&gt;样式)。多年来,这种情况逐渐减弱,直到2.7和3.x时,它才适用于“许多类型”,即使在stdlib中也有例外(例如,作为本地创建的`namedtuple`类型将为您提供一个`repr`,您不能`eval`),但这是最初的想法。 (2认同)

Tan*_*113 7

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)'
Run Code Online (Sandbox Code Playgroud)

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