repr()
:对象的可评估字符串表示形式(可以是“eval()”
它,意味着它是一个字符串表示形式,评估为Python
对象)
换句话说:
>>> x = 'foo'
>>> repr(x)
"'foo'"
问题:
repr(x)
时会得到双引号? (我不明白
当我做str(x)
)'foo'
时会eval("'foo'")
而不是{{1}}
对象答案 0 :(得分:154)
>>> x = 'foo'
>>> x
'foo'
因此名称x
附加到'foo'
字符串。当您拨打repr(x)
时,解释程序会将'foo'
代替x
,然后调用repr('foo')
。
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
实际上调用__repr__
的魔术方法x
,其中字符串包含分配给{的值'foo'
的表示形式{1}}。因此,它会在字符串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'
字符串相同。
答案 1 :(得分:9)
您在交互式口译员上获得的反馈也使用repr
。当您键入表达式(让它为expr
)时,解释器基本上会result = expr; if result is not None: print repr(result)
。因此,示例中的第二行将字符串foo
格式化为您想要的表示形式('foo'
)。然后解释器创建 的repr
表示,留下双引号。
为什么当我将%r与双引号和单引号转义组合并将它们打印出来时,它会按照我在.py文件中编写它的方式打印它,但不是我希望看到它的方式? / p>
我不确定你在这里问的是什么。运行single ' and double " quotes
时,文本repr
包含一种引用的转义。当然它确实如此,否则它将不是Python规则的有效字符串文字。这正是您通过致电repr
所要求的。
另请注意,eval(repr(x)) == x
类比并不意味着文字。它是一种近似值,适用于大多数(所有?)内置类型,但主要的是通过查看repr
输出,您可以很好地了解类型和逻辑“值”。
答案 2 :(得分:3)
1)repr('foo')
的结果是字符串 'foo'
。在您的Python shell中,表达式的结果也表示为表示,因此您基本上看到repr(repr('foo'))
。
2)eval
计算表达式的结果。结果始终是值(例如数字,字符串或对象)。多个变量可以引用相同的值,如:
x = 'foo'
y = x
x和y现在指的是相同的值。
3)我不知道你的意思。你能发一个例子吗,你想看到什么?
答案 3 :(得分:2)
当你说
时foo = 'bar'
baz(foo)
您没有将foo
传递给baz
函数。 foo
只是用于表示值的名称,在本例中为'bar'
,该值将传递给baz
函数。
答案 4 :(得分: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()显示了日期对象的官方表示。