繁体   English   中英

python 字符串格式化 - 隐式 str() + 格式说明符

[英]python string formatting - implicit str() + format specifiers

字符串格式支持隐式str化。 但是,字符串格式说明符似乎与此不兼容,只有显式str对象(无论使用 type= s )。 如果不调出 cpython 代码,我在任何地方都找不到这种行为的记录。 默认 ubuntu 20.04 python3.8 安装。 使用显式的str()调用是可行的,但它不是很干净,尤其是在我的用例中,它现在会增加代码。

obj = object()
explicit = str(obj)
print(f"{explicit:.5}")
print(f"{obj}")
print(f"{obj:.5}") # TypeError: unsupported format string passed to object.__format__

问题:

  • 我是否正确解释了这一点
  • 我应该在哪里自己收集这些信息(如果存在于 cpython 代码之外),并且
  • 有没有办法在依赖隐式str()化的同时完成格式说明符{:...}

您可以在 object class 中实现 __format__ 方法,也可以将 str() 直接放在格式字符串中:

print(f"{str(obj):.5}")

有关详细信息,请参阅PEP 498

请注意, f"{obj:s..5}"也可以工作,但在同一规范中,!s 和 !r 被认为是多余的,仅出于向后兼容性而维护

如果您明确请求字符串转换,它会起作用:

>>> print(f"{obj!s:.5}")
<obje

在幕后,我怀疑表达式的结果不是首先传递给str ,而是传递给format

>>> format(obj, "%s")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to object.__format__

在这种情况下,无论出于何种原因, object.__format__本身都不会使用object.__str__自动转换为字符串。

来自 C 源

/* Issue 7994: If we're converting to a string, we
   should reject format specifications */

问题object。 格式应该拒绝格式字符串认为形成所有其他对象的基础 object 不应假定它是支持字符串说明符的类似字符串的东西。 格式说明符是特定于类型的,因此所有类型的父级无法对它们做出任何判断。 它必须将自己转换为具有格式化程序的子类型之一,但是哪个子类型

一个有趣的例子是用户定义的 class 没有实现格式化程序,因此使用默认值。

>>> class Foo:
...     pass
... 
>>> foo = Foo()
>>> f"{foo:.5}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to Foo.__format__

为了得到你想要的结果, object.__format__必须调用foo.__str__().__format__(the_specifier)但这是一件奇怪的事情。 为什么要假设字符串格式化程序在这里应用是正确的? 为什么不__repr__代替? object 明确表示它不希望没有臭名昭著的格式规范,所以不要给它一个。

解决方案是首先提供显式字符串转换

f"{obj!s:.5}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM