理解Python中的repr()函数

时间:2011-10-16 12:07:56

标签: python repr

repr():对象的可评估字符串表示形式(可以是“eval()” 它,意味着它是一个字符串表示形式,评估为Python 对象)

换句话说:

>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  1. 为什么我repr(x)时会得到双引号? (我不明白 当我做str(x)
  2. 为什么我'foo'时会eval("'foo'")而不是{{1}} 对象

5 个答案:

答案 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()显示了日期对象的官方表示。