我真的很好奇:s
Python 3中的格式字符串.文档说的!s
是转换,:s
就是这样format_spec
.
它也表示!s
会适用str()
,但它没有说出类似的内容:s
.我认为它们之间没有显着差异,但我想确定.谁能澄清这些?
一些代码示例:
print("{!s}".format("this")) print("{:s}".format("that")) # I want to be sure that these two are processed identically internally
它仍然令人困惑,但让我用自己的(layperson)的话来结束.
type("whatever".format)
永远str
.
!s
如果要str
在格式化之前将对象转换为使用,请使用.
:s
表示str
在某些内部格式化过程中将对象(或转换的对象)视为对象.这是默认值format_spec
.
这里有什么不对吗?
!s
和其兄弟!a
及!r
应用str()
,ascii()
并repr()
分别前插值和格式.这些称为转换标志,是格式字符串语法规范的一部分,而不是插值时应用于值的每字段格式规范:
的转换场使一个类型强制格式化之前.通常,格式化值的工作是通过
__format__()
值本身的方法完成的.但是,在某些情况下,最好强制将类型格式化为字符串,从而覆盖其自己的格式定义.通过在调用之前将值转换为字符串__format__()
,可以绕过普通的格式化逻辑.
大胆强调我的.
:s
仅在转换结果之后应用(如果未应用转换,则仅适用于原始对象),并且仅当__format__
对象类型的方法支持该格式化选项时才适用.通常,只有类型的对象str
支持此格式化程序; 它是默认设置,主要是因为格式规范迷你语言允许存在类型字符,并且因为旧式 %
printf
格式具有%s
格式.如果您尝试将该s
类型应用于不支持它的对象,则会出现异常.
使用!s
(或!a
或!r
)当你有一个对象,它本身不是一个字符串,或者不支持的格式,否则(并非所有类型做),或会从他们不同的格式str()
,ascii()
或repr()
转换:
>>> class Foo: ... def __str__(self): ... return "Foo as a string" ... def __repr__(self): ... return "" ... 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: !a: No conversions: Foo formatted to '>50s' spec
注意:格式规范指定的所有格式都是__format__
方法的责任; 最后一行不应用>50s
格式规范中的对齐操作,该Foo.__format__
方法仅在格式化操作中使用它作为文字文本(!r
在此处使用转换).
另一方面,对于转换后的值,str.__format__
使用该方法,输出在50字符宽的字段中右对齐,在左侧填充空格.