!s
及其sibling !a
和!r
分别应用str()
、ascii()
和repr()
before插值和格式化.它们被称为conversion flags,是Format String Syntax spec的一部分,而不是插值时应用于值的per-field formatting spec:
conversion字段导致类型强制before formatting.通常,格式化值的工作由值本身的__format__()
方法完成.However, in some cases it is desirable to force a type to be formatted as a string, overriding its own definition of formatting.通过在调用__format__()
之前将值转换为字符串,可以绕过正常的格式化逻辑.
我的.
:s
仅适用于转换结果(如果未应用转换,则适用于原始对象),并且仅适用于对象类型的__format__
方法支持该格式选项.通常,只有str
类型的对象支持此格式化程序;它是默认的,主要是因为Format Specification Mini-Language允许存在一个类型字符,并且旧的%
printf
-style formatting有%s
格式.如果试图将s
类型应用于不支持它的对象,则会出现异常.
如果对象本身不是字符串,或者不支持其他格式(并非所有类型都支持),或者格式与str()
、ascii()
或repr()
转换不同,请使用!s
(或!a
或!r
):
>>> class Foo:
... def __str__(self):
... return "Foo as a string"
... def __repr__(self):
... return "<Foo as repr, with åéæ some non-ASCII>"
... def __format__(self, spec):
... return "Foo formatted to {!r} spec".format(spec)
...
>>> print("""\
... Different conversions applied:
... !s: {0!s:>60s}
... !r: {0!r:>60s}
... !a: {0!a:>60s}
... No conversions: {0:>50s}
... """.format(Foo()))
Different conversions applied:
!s: Foo as a string
!r: <Foo as repr, with åéæ some non-ASCII>
!a: <Foo as repr, with \xe5\xe9\xe6 some non-ASCII>
No conversions: Foo formatted to '>50s' spec
注:格式规范规定的all格式由__format__
方法负责;最后一行没有应用>50s
格式规范中的对齐操作,Foo.__format__
方法只在格式化操作中将其用作文本(此处使用!r
转换).
另一方面,对于转换后的值,使用str.__format__
方法,输出在50个字符宽的字段中向右对齐,并在左侧填充空格.