[英]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__
问题:
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.