根据Python 2.7.12 documentation:
!s
(应用str()
)和!r
(应用repr()
)可用于转换 格式化之前的值。>>> import math >>> print 'The value of PI is approximately {}.'.format(math.pi) The value of PI is approximately 3.14159265359. >>> print 'The value of PI is approximately {!r}.'.format(math.pi) The value of PI is approximately 3.141592653589793.
有趣的是,转换后的值是repr()
的输出,而不是str()
。
>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'
那么“转换价值”在这里意味着什么呢?减少人类的可读性?
答案 0 :(得分:19)
为了在字符串中格式化中的某些内容,必须首先创建该字符串的字符串表示形式。 “转换值”基本上是在讨论如何构造字符串表示。在python中,有两个相当自然的选择来获取某些东西的字符串表示...... str
和repr
。 str
通常更加人性化,repr
通常更精确。也许official documentation是寻找差异的最佳去处:
object.__repr__(self)
由
repr()
内置函数调用,以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果无法做到这一点,则应返回<...some useful description...>
形式的字符串。返回值必须是字符串对象。如果一个类定义__repr__()
但不定义__str__()
,那么当需要该类的实例的“非正式”字符串表示时,也会使用__repr__()
。这通常用于调试,因此表示信息丰富且明确无误。
object.__str__(self)
由str(object)和内置函数format()和print()调用,以计算对象的“非正式”或可打印的字符串表示形式。返回值必须是字符串对象。
此方法与
object.__repr__()
的不同之处在于,不期望__str__()
返回有效的Python表达式:可以使用更方便或更简洁的表示。内置类型对象定义的默认实现调用
object.__repr__()
。
在str.format
中,!s
选择使用str
格式化对象,而!r
选择repr
来格式化值。
字符串很容易看出差异(因为字符串的repr
将包含外部引号)。:
>>> 'foo {}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"
这两种方法之间的区别实际上取决于被格式化的对象。对于许多对象(例如那些不覆盖__str__
方法的对象),格式化输出没有区别。