158

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

换句话说:

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

问题:

  1. 为什么我会得到双引号repr(x)?(当我做的时候我没有得到它们str(x)
  2. 为什么我会得到'foo'eval("'foo'")而不是 x 是对象?
4

5 回答 5

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

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

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

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

>>> 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'

和 string 的 string 表示'foo'是相同的 string 'foo'

于 2011-10-16T12:22:14.787 回答
14

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

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

我不确定你在这里问什么。text single ' and double " quotes,当运行时repr,包括一种引用的转义。当然可以,否则它不会是 Python 规则的有效字符串文字。这正是您通过调用所要求的repr

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

于 2011-10-16T12:17:27.520 回答
9

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()显示了日期对象的官方表示。

于 2018-04-08T12:05:25.463 回答
3

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

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

x = 'foo'
y = x

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

3)我不明白你在这里的意思。你能发布一个例子,你想看到什么?

于 2011-10-16T12:14:23.017 回答
1

当你说

foo = 'bar'
baz(foo)

你没有传递foobaz函数。 foo只是一个用于表示一个值的名称,在这种情况下'bar',该值被传递给baz函数。

于 2011-10-16T12:22:07.497 回答