问题:了解Python中的repr()函数
repr()
:对象的可评估字符串表示形式(可以“ eval()”表示它,这是一个评估为Python对象的字符串表示形式)
换一种说法:
>>> x = 'foo'
>>> repr(x)
"'foo'"
问题:
- 为什么我得到双引号
repr(x)
?(这样做的时候我不懂str(x)
) - 为什么我会
'foo'
当我做eval("'foo'")
,而不是X也就是对象?
回答 0
>>> 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'
。
回答 1
您在交互式解释器上获得的反馈也将使用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
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)我不知道你在这里是什么意思。您可以发表一个例子,以及您想看到的内容吗?
回答 4
当你说
foo = 'bar'
baz(foo)
您没有传递foo
给该baz
函数。 foo
在这种情况下'bar'
,只是一个用于表示值的名称,该值将传递给baz
函数。