Python字符串格式:何时使用!s转换标志

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__返回正确类型的对象.