当前位置:  开发笔记 > 编程语言 > 正文

使用!s vs.:s在Python中格式化字符串

如何解决《使用!svs.:s在Python中格式化字符串》经验,为你挑选了1个好方法。

我真的很好奇: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

它仍然令人困惑,但让我用自己的(layperson)的话来结束.

    type("whatever".format)永远str.

    !s如果要str在格式化之前将对象转换为使用,请使用.

    :s表示str在某些内部格式化过程中将对象(或转换的对象)视为对象.这是默认值format_spec.

这里有什么不对吗?



1> Martijn Piet..:

!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字符宽的字段中右对齐,在左侧填充空格.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有