Answers:
>>> 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。当您键入表达式(顺便说一句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输出,您可以很好地了解类型和逻辑“值” 。
repr都应该是可以传递给eval(或复制并粘贴到您的源代码中)以产生相等值的东西,或者是尝试时会产生SyntaxError的东西(通常是<…>产生的样式object.__repr__。多年来,这种情况逐渐被淡化,直到2.7和3.x才是“许多类型”,甚至在stdlib中也有例外(例如,namedtuple创建为本地类型的类型将为您提供“ repr您可以” t eval),但这是最初的想法。