Python 的多种字符串格式化方法 - 较旧的方法是否将被弃用?
- 2024-12-16 08:35:00
- admin 原创
- 140
问题描述:
Python 至少有六种格式化字符串的方法:
In [1]: world = "Earth"
# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'
# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'
# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'
# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'
# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'
In [7]: from string import Template
# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'
不同方法的简要历史:
printf
-style 格式自 Python 诞生之初就已经存在该类
Template
是在 Python 2.4 中引入的该
format
方法在 Python 2.6 中引入f
-strings 是在 Python 3.6 中引入的
我的问题是:
-style 格式是否
printf
已被弃用或者将被弃用?在 中
Template class
,该substitute
方法是否已被弃用或将被弃用?(我不是在谈论safe_substitute
,据我所知它提供了独特的功能)
类似的问题以及为什么我认为它们不是重复的:
Python 字符串格式:% 与 .format — 仅处理方法 1 和 2,并询问哪种方法更好;我的问题明确是关于根据 Python 之禅的弃用
字符串格式选项:优点和缺点- 仅处理问题中的方法 1a 和 1b,答案中的方法 1 和 2,并且不涉及弃用
高级字符串格式化与模板字符串— 主要涉及方法 1 和方法 3,并未涉及弃用问题
字符串格式化表达式(Python) ——答案提到原始的 '%' 方法计划被弃用。但是计划弃用、即将弃用和实际弃用之间有什么区别?而且
printf
-style 方法甚至没有引发PendingDeprecationWarning
,那么它真的会被弃用吗?这篇文章也很旧了,所以信息可能已经过时了。
参见
PEP 502:字符串插值 - 扩展讨论
字符串格式化程序
解决方案 1:
新.format()
方法旨在取代旧的%
格式化语法。后者已被淡化(但尚未正式弃用)。该方法文档说明了以下内容:
这种字符串格式化的方法是 Python 3 中的新标准,并且应该比新代码中的字符串格式化操作
%
中描述的格式化更受欢迎。
(重点是我的)。
为了保持向后兼容性并使过渡更容易,旧格式暂时保留。来自原始PEP 3101 提案:
向后兼容性
通过保留现有机制,可以保持向后兼容性。新系统不会与现有字符串格式化技术的任何方法名称发生冲突,因此两个系统可以共存,直到旧系统被弃用为止。
请注意,直到弃用旧系统的时候;它还没有被弃用,但是无论何时编写新代码都必须使用新系统。
新系统的优点在于您可以结合旧格式化程序的元组和字典方法%
:
"{greeting}, {0}".format(world, greeting='Hello')
并且可以通过object.__format__()
用于处理单个值格式的钩子进行扩展。
请注意,旧系统有%
类Template
,后者允许您创建子类来添加或更改其行为。新式系统有类Formatter
来填补同样的空白。
Python 3 不再弃用该功能,而是在printf
-style 字符串格式部分给出警告:
注意:此处描述的格式化操作表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或
str.format()
接口有助于避免这些错误。这些替代方案还提供了更强大、更灵活、更可扩展的文本格式化方法。
Python 3.6 还添加了格式化字符串文字,将表达式内联到格式字符串中。这是使用插值创建字符串的最快方法,应该在str.format()
任何可以使用文字的地方使用它。
解决方案 2:
字符串格式化运算符%
并未被弃用,也不会被删除 - 尽管有其他答案。
每次在 Python 开发列表中提出这个主题时,都会有关于哪种方式更好的激烈争论,但对于是否删除经典方式没有争议 - 它会保留下来。尽管在 PEP 3101 上有说明,但 Python 3.1 已经来了又去,%
格式化仍然存在。
保持经典风格的声明很明确:它很简单,它很快,可以快速完成简短的事情。使用该.format
方法并不总是更具可读性 - 几乎没有人 - 即使是核心开发人员,也可以使用提供的完整语法而.format
不必查看参考资料。早在 2009 年,有人收到过这样的消息:http://mail.python.org/pipermail/python-dev/2009-October/092529.html - 从那时起,该主题几乎没有出现在列表中。
2016 年更新
在当前的 Python 开发版本(即将成为 Python 3.6)中,有第三种字符串插值方法,详见PEP-0498。它定义了一个新的引号前缀f""
(除了当前的u""
,b""
和r""
)。
在字符串前面加上前缀f
将在运行时调用字符串对象上的方法,该方法将自动将当前范围的变量插入到字符串中:
>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'
解决方案 3:
查看较旧的 Python 文档和 PEP 3101,其中有一条声明称 % 运算符将来会被弃用并从该语言中删除。以下声明出现在 Python 3.0、3.1 和 3.2 的 Python 文档中:
由于 str.format() 相当新,许多 Python 代码仍然使用 % 运算符。但是,由于这种旧式格式化最终将从语言中删除,因此通常应使用 str.format()。
如果您转到Python 3.3 和 3.4 文档中的同一部分,您将看到该语句已被删除。我在文档中的其他任何地方也找不到任何其他语句表明该运算符将被弃用或从语言中删除。同样值得注意的是,PEP3101在两年半多的时间里没有被修改过(2011 年 9 月 30 日,星期五)。
更新
PEP461接受将 % 格式添加到字节和字节数组中,这应该是 Python 3.5 或 3.6 的一部分。这是 % 运算符仍然活跃的另一个迹象。
解决方案 4:
虽然文档中有各种迹象表明.format
f 字符串优于%
字符串,但没有任何生存计划来弃用后者。
在提交问题#14123:明确提到旧式%字符串格式有注意事项,但不会很快消失。中,受到问题表明目前没有弃用printf样式格式的计划的启发,-formatting上的文档%
被编辑为包含以下短语:
由于新的字符串格式化语法更加灵活,可以自然地处理元组和字典,因此建议在新代码中使用。不过,目前还没有计划弃用 printf 样式的格式化。
(重点是我的。)
这句话后来在提交 Close #4966 中被删除:修改序列文档以更好地解释现代 Python 的状态。这似乎表明弃用格式的计划又回到了计划中……但深入研究错误跟踪器会发现意图恰恰相反。在错误跟踪器上,提交的作者这样%
描述更改:
更改了描述 printf 样式格式和 str.format 方法之间关系的文字(故意消除前者可能消失的暗示 - 对于我们来说,认真考虑将其消灭是不切实际的)
换句话说,我们对%
-formatting 文档进行了两次连续的更改,旨在明确强调它不会被弃用,更不用说删除了。文档仍然对不同类型的字符串格式的相对优点持有不同意见,但它们也明确表示 -formatting%
不会被弃用或删除。
此外,该段落的最新一次修改是在 2017 年 3 月,修改内容如下……
这里描述的格式化操作表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或
str.format
接口有助于避免这些错误。这些替代方案还提供了更强大、更灵活、更可扩展的文本格式化方法。
... 变成这样:
此处描述的格式化操作表现出各种怪癖,会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字、接口
str.format
或模板字符串可能有助于避免这些错误。这些替代方案各有优缺点,并具有简单性、灵活性和/或可扩展性等优势。
请注意从“有助于避免”到“可能有助于避免”的变化,以及对.format
和 f 字符串的明确建议如何被关于每种风格如何“提供自己的权衡和好处”的空洞、模棱两可的散文所取代。也就是说,不仅正式弃用不再是可能的,而且当前文档公开承认%
格式化至少比其他方法有一些“好处”。
我从这一切推断,弃用或删除%
格式的运动不仅失败了,而且被彻底和永久地击败了。
解决方案 5:
Guido 对此的最新立场似乎表明如下:
Python 3.0 中的新功能
PEP 3101:字符串格式化的新方法
新的内置字符串格式化操作系统取代了 % 字符串格式化运算符。(但是,% 运算符仍受支持;它将在 Python 3.1 中被弃用,并在以后从语言中删除。)阅读 PEP 3101 了解详细信息。
而PEP3101本身的最后一次修改可以追溯到 (2011 年 9 月 30 日,星期五),所以我想到目前为止这方面没有取得任何进展。
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)