cli*_*ick 14 python string string-formatting
Python中这两个字符串格式语句之间的区别是什么:
'{0}'.format(a)
'{0!s}'.format(a)
Run Code Online (Sandbox Code Playgroud)
如果a是整数,列表或字典,则两者都具有相同的输出.是第一个{0}进行隐式str()调用的人吗?
PS:关键字:感叹号/爆炸"!s"格式化
hjp*_*r92 21
它在文档中提到:
转换字段在格式化之前导致类型强制.通常,格式化值的工作是通过
__format__()值本身的方法完成的.但是,在某些情况下,最好强制将类型格式化为字符串,从而覆盖其自己的格式定义.通过在调用之前将值转换为字符串__format__(),可以绕过普通的格式化逻辑.目前支持两个转换标志:'
!s'调用str()值,'!r'调用repr().
可以采用一个示例(再次从文档中)来显示差异:
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
Run Code Online (Sandbox Code Playgroud)
Syl*_*oux 14
简单地说:
'{0}'.format(a)将使用结果a.__format__()显示值'{0!s}'.format(a)将使用结果a.__str__()显示值'{0!r}'.format(a)将使用结果a.__repr__()显示值>>> class C:
... def __str__(self): return "str"
... def __repr__(self): return "repr"
... def __format__(self, format_spec): return "format as " + str(type(format_spec))
...
>>> c = C()
>>> print "{0}".format(c)
format as <type 'str'>
>>> print u"{0}".format(c)
format as <type 'unicode'>
>>> print "{0!s}".format(c)
str
>>> print "{0!r}".format(c)
repr
Run Code Online (Sandbox Code Playgroud)
关于第二个论点__format__,引用PEP 3101 "在每种类型基础上控制格式":
'format_spec'参数将是字符串对象或unicode对象,具体取决于原始格式字符串的类型.该
__format__方法应测试说明符参数的类型,以确定是否返回字符串或unicode对象.该方法的责任是__format__返回正确类型的对象.