Understanding repr( ) function in Python

repr(): evaluatable string representation of an object (can "eval()" it, meaning it is a string representation that evaluates to a Python object)

In other words:

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

Questions:

  1. Why do I get the double quotes when I do repr(x)? (I don't get them when I do str(x))
  2. Why do I get 'foo' when I do eval("'foo'") and not x which is the object?
199450 次浏览

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

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

x = 'foo'
y = x

X 和 y 现在引用相同的值。

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

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

为什么当我将% r 与双引号和单引号转义相结合并打印出来时,它会按照我在。Py 文件,但不是我想看到的那样?

我不知道你在问什么。当通过 repr运行时,文本 single ' and double " quotes包含一种引号的转义。当然可以,否则根据 Python 规则,它不会是有效的字符串文本。这正是你打电话给 repr所要求的。

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

当你说

foo = 'bar'
baz(foo)

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

>>> x = 'foo'
>>> x
'foo'

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

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

repr实际上调用了 x的一个神奇方法 __repr__,它给出了包含分配给 x的值 'foo'的表示形式的 __repr__0。因此它在字符串 ""中返回 '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'相同。

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()显示了 date 对象的正式表示形式。