了解Python中的repr()函数


151

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

换一种说法:

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

问题:

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

Answers:


165
>>> 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'"。的想法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函数的用例吗?我无法理解
gaurav parashar,

14

您在交互式解释器上获得的反馈也将使用repr。当您键入表达式(顺便说一句expr)时,解释器基本上会执行result = expr; if result is not None: print repr(result)。因此,在您的例子中,第二行格式化字符串foo为表示你要('foo')。然后解释创建repr的esentation ,让你用双引号。

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

我不确定您在这里问什么。文本single ' and double " quotes在运行时repr,包含一种引号的转义符。当然可以,否则Python规则将不是有效的字符串文字。这正是您要求通过致电repr

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


2
最初,它实际上字面意义:每个值repr都应该是可以传递给eval(或复制并粘贴到您的源代码中)以产生相等值的东西,或者是尝试时会产生SyntaxError的东西(通常是<…>产生的样式object.__repr__。多年来,这种情况逐渐被淡化,直到2.7和3.x才是“许多类型”,甚至在stdlib中也有例外(例如,namedtuple创建为本地类型的类型将为您提供“ repr您可以” t eval),但这是最初的想法。
abarnert

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

从输出中我们看到repr()显示了date对象的正式表示形式。


3

1)的结果repr('foo')字符串 'foo'。在您的Python Shell中,表达式的结果也被表示为表示形式,因此您基本上可以看到repr(repr('foo'))

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

x = 'foo'
y = x

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

3)我不知道你在这里是什么意思。您可以发表一个例子,以及您想看到的内容吗?


1

当你说

foo = 'bar'
baz(foo)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.