!s(apply str())和!r(apply repr())可用于在格式化之前转换值。
字符串之间的区别很容易看出来(因为repr字符串将包含外部引号):
1 | 'foo {!s}'.format('bar') |
这两种方法之间的区别实际上主要取决于要格式化的对象。对于许多对象(例如那些不覆盖该__str__
方法的对象),格式化输出将没有差异。
在python中,有两种相当自然的选择来获取… str
和repr
的字符串表示形式。 str
通常更人性化,repr
更精确。也许官方文档是寻找差异的最佳地方:
object.__repr__(self)
由
repr()
内置函数调用以计算对象的“正式”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(在适当的环境下)。如果这不可能,<...some useful description...>
则应返回形式的字符串。返回值必须是一个字符串对象。如果定义了一个类,__repr__()
但未定义__str__()
,则__repr__()
当需要该类的实例的“非正式”字符串表示形式时,也会使用该类。这通常用于调试,因此重要的是,表示形式必须信息丰富且明确。
object.__str__(self)
- 由str(object)和内置函数format()和print()调用,以计算对象的“非正式”或可很好打印的字符串表示形式。返回值必须是一个字符串对象。
- 此方法的不同之处在于,
object.__repr__()
不期望__str__()
返回有效的Python表达式:可以使用更方便或更简洁的表示形式。 - 内置类型object invokes定义的默认实现
object.__repr__()
。
在str.format
中,!s
选择用于str
设置对象格式,而!r
选择repr
设置值格式。
最后再写个例子来更加的认识!r
:🤭🤭🤭🤭🤭🤭🤭🤭🤭
1 | name = '全洛' |
输出结果为:
1 | '全洛: Hello, World' |