Python 的多种字符串格式化方法 - 较旧的方法是否将被弃用?

2024-12-16 08:35:00
admin
原创
142
摘要:问题描述:Python 至少有六种格式化字符串的方法:In [1]: world = "Earth" # method 1a In [2]: "Hello, %s" % world Out[2]: 'Hello, Earth' # method 1b In [3]:...

问题描述:

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:

虽然文档中有各种迹象表明.formatf 字符串优于%字符串,但没有任何生存计划来弃用后者。

在提交问题#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 日,星期五),所以我想到目前为止这方面没有取得任何进展。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1317  
  IPD(Integrated Product Development)项目管理作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它旨在通过整合企业的各种资源,实现产品的快速、高质量开发,从而提升企业的市场竞争力。IPD项目管理涵盖多个方面,其中五大核心要素尤为关键,它们相互关联、相互影响,共同构成了IPD项目...
IPD流程中PDCP是什么意思   5  
  IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理思想、模式和方法。它强调将产品开发视为一个完整的流程,涵盖从概念产生到产品退市的全生命周期,通过跨部门团队的协同合作,实现缩短产品上市时间、提高产品质量、降低成本等目标。IPD测试流程作为IPD体系的重...
华为IPD流程   7  
  华为 IPD 产品开发流程是一套先进且成熟的产品开发管理体系,在提升企业产品竞争力、促进团队协作等方面发挥着重要作用。它以市场为导向,强调跨部门团队的协同合作,旨在实现产品的快速、高质量交付,满足客户需求并提升企业的经济效益。通过深入了解和应用 IPD 产品开发流程,企业能够优化内部资源配置,提高团队协作效率,从而在激...
IPD管理流程   8  
  IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理思想、模式和方法。它强调将产品开发视为一个完整的流程,涵盖从概念产生到产品退市的全生命周期,涉及市场、研发、生产、销售、售后等多个部门的协同合作。构建高效的项目管理文化对于企业的发展至关重要,而IPD培...
IPD开发流程管理   5  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用