理解 Python 中的 repr() 函数
Posted
技术标签:
【中文标题】理解 Python 中的 repr() 函数【英文标题】:Understanding repr( ) function in Python 【发布时间】:2011-12-08 16:59:23 【问题描述】:repr()
: 对象的可评估字符串表示(可以“eval()”
它,这意味着它是一个字符串表示形式,计算结果为 Python
对象)
换句话说:
>>> x = 'foo'
>>> repr(x)
"'foo'"
问题:
-
为什么我在执行
repr(x)
时会得到双引号? (我不明白他们
当我这样做时str(x)
)
为什么当我执行eval("'foo'")
时得到'foo'
而不是x
对象?
【问题讨论】:
【参考方案1】:1) repr('foo')
的结果是 字符串 'foo'
。在您的 Python shell 中,表达式的结果也表示为一种表示形式,因此您实际上看到的是repr(repr('foo'))
。
2) eval
计算表达式的结果。结果总是一个值(例如一个数字、一个字符串或一个对象)。多个变量可以引用同一个值,如:
x = 'foo'
y = x
x 和 y 现在指的是同一个值。
3) 我不明白你的意思。您能否发布一个示例,以及您希望看到的内容?
【讨论】:
【参考方案2】:您在交互式解释器上获得的反馈也使用repr
。当你输入一个表达式时(让它是expr
),解释器基本上是result = expr; if result is not None: print repr(result)
。因此,您示例中的第二行 是 将字符串 foo
格式化为您想要的表示形式 ('foo'
)。然后解释器创建 that 的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
你不能eval
),但这是最初的想法。【参考方案3】:
当你说
foo = 'bar'
baz(foo)
您没有将foo
传递给baz
函数。 foo
只是一个用于表示值的名称,在本例中为'bar'
,并且该值被传递给baz
函数。
【讨论】:
【参考方案4】:>>> x = 'foo'
>>> x
'foo'
所以名称x
附加到'foo'
字符串。例如,当您调用repr(x)
时,解释器会输入'foo'
而不是x
,然后调用repr('foo')
。
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
实际上调用了x
的魔术方法__repr__
,它给出了包含分配给x
的值'foo'
的表示的字符串。所以它在字符串""
中返回'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 函数的用例。我无法理解【参考方案5】: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()
显示了日期对象的官方表示。
【讨论】:
以上是关于理解 Python 中的 repr() 函数的主要内容,如果未能解决你的问题,请参考以下文章