我对Python3中的:s格式字符串非常好奇.conversion等于:s.

它还说!s将适用于str(),但它没有说任何类似的:s.我认为他们之间没有明显的区别,但我想确定一下.有人能澄清这些吗?

一些代码示例:

print("{!s}".format("this"))
print("{:s}".format("that"))
# I want to be sure that these two are processed identically internally

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

  1. type("whatever".format)永远是str.
  2. 如果要在格式化之前将对象转换为str,请使用!s.
  3. :s表示在某些内部格式化过程中,对象(或转换的对象)将被视为str.这是默认的format_spec.

这里有什么问题吗?

推荐答案

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

Python-3.x相关问答推荐

在numpy. linalg的qr之后使用scipy. integrate中的solve_ivp时出现了一个奇怪的错误

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

我不能使用拆分来分隔数据

比较和排序 DataFrame 两列中的值并在 python 中的同一行中排序

为什么空列表也能起作用?

在不使用 split 函数的情况下从字符串中分割逗号(','),句号('.')和空格(' '),将字符串的单词附加到列表中

如何创建与导航抽屉一起使用的导航栏

基于其他列的条件向Panda数据框中添加值到新列

aiogram机器人中处理文本输入异常而不是按钮点击的回调函数.

TypeError: issubclass() arg 1 在 Flask 中导入 langchain 时必须是一个类

找到操作系统的图片文件夹的 CLI

如何融化具有自定义名称的Pandas

从 h264 帧解析数据包时 PyAV 不一致

聚合(aggregate)为最多包含两个元素的列表

python 3中的SQLAlchemy ER图

将字符串表示与使用整数值的枚举相关联?

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

在 Python 3 中获取所有超类

从大字典中弹出 N 项的最快方法