repr()
:对象的可评估字符串表示形式(可以"eval()"它,这意味着它是一个求值为Python对象的字符串表示形式)
换一种说法:
>>> x = 'foo'
>>> repr(x)
"'foo'"
Run Code Online (Sandbox Code Playgroud)
问题:
repr(x)
?(当我这样做时,我不会得到它们str(x)
)'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
输出中获得了类型和逻辑"值"的相当好的概念.
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() 显示了日期对象的官方表示。