San*_*Lee 37 python string string-formatting python-3.x
我真的很好奇:sPython 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
Run Code Online (Sandbox Code Playgroud)
它仍然令人困惑,但让我用自己的(layperson)的话来结束.
type("whatever".format)永远str.!s如果要str在格式化之前将对象转换为使用,请使用.:s表示str在某些内部格式化过程中将对象(或转换的对象)视为对象.这是默认值format_spec.这里有什么不对吗?
Mar*_*ers 34
!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 "<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
Run Code Online (Sandbox Code Playgroud)
注意:格式规范指定的所有格式都是__format__方法的责任; 最后一行不应用>50s格式规范中的对齐操作,该Foo.__format__方法仅在格式化操作中使用它作为文字文本(!r在此处使用转换).
另一方面,对于转换后的值,str.__format__使用该方法,输出在50字符宽的字段中右对齐,在左侧填充空格.
| 归档时间: |
|
| 查看次数: |
4537 次 |
| 最近记录: |