112

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- 样式格式从 Python 婴儿期就已经存在
  • 该类Template是在 Python 2.4 中引入的
  • format方法在 Python 2.6 中引入
  • f-strings 是在 Python 3.6 中引入的

我的问题是:

  • -style 格式是否printf已弃用或将被弃用?
  • Template class,substitute方法是被弃用还是将被弃用?(我不是在谈论safe_substitute,据我了解,它提供了独特的功能)

类似的问题以及为什么我认为它们不重复:

也可以看看

4

5 回答 5

58

.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()任何可以使用文字的地方使用它们。

于 2012-11-19T10:57:05.907 回答
47

不推荐使用字符串格式的%运算符,也不会删除 - 尽管有其他答案。
每次在 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.'
于 2012-11-19T13:29:46.323 回答
19

Guido 在这方面的最新立场似乎在这里表明:

Python 3.0 的新特性

PEP 3101:字符串格式化的新方法

用于内置字符串格式化操作的新系统替换了 % 字符串格式化操作符。(但是,仍然支持 % 运算符;它将在 Python 3.1 中弃用,并在稍后从该语言中删除。)阅读 PEP 3101 以获得完整的独家新闻。

PEP3101本身的最后一次修改可以追溯到(2011 年 9 月 30 日星期五),所以我想最近没有进展。

于 2012-11-19T11:00:00.710 回答
19

查看较旧的 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 的一部分。这是 % 操作符还活着并且在踢的另一个迹象。

于 2014-04-30T06:30:30.723 回答
18

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

在提交问题 #14123:明确提到旧样式 % 字符串格式有一些警告,但不会很快消失。, 受问题的启发指示当前没有弃用 printf-style 格式的计划,编辑了有关%-formatting 的文档以包含以下短语:

由于新的字符串格式化语法更加灵活并且可以自然地处理元组和字典,因此建议用于新代码。但是,目前没有弃用 printf 样式格式的计划

(强调我的。)

这个短语后来在提交Close #4966: revamp the sequence docs 中被删除,以便更好地解释现代 Python 的状态。这似乎表明弃用%格式的计划重新出现在卡片上……但深入研究错误跟踪器会发现其意图恰恰相反。在错误跟踪器上,提交的作者描述了这样的变化:

  • 更改了描述 printf 样式格式和 str.format 方法之间关系的散文(故意消除前者存在真正消失的危险的暗示——我们认真考虑将其杀死是不切实际的)

换句话说,我们对%-formatting 文档进行了两次连续更改,旨在明确强调不会被弃用,更不用说删除了。文档仍然对不同类型的字符串格式的相对优点持意见,但他们也很清楚%-formatting 不会被弃用或删除。

更重要的是,2017 年 3 月对那段的最近一次更改,从这个...

此处描述的格式化操作表现出各种怪癖,这些怪癖会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或str.format接口有助于避免这些错误。这些替代方案还提供了更强大、更灵活和可扩展的文本格式设置方法。

...对此:

此处描述的格式化操作表现出各种怪癖,这些怪癖会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字、str.format接口或模板字符串可能有助于避免这些错误。这些替代方案中的每一个都提供了它们自己的权衡和简单性、灵活性和/或可扩展性的好处。

请注意从“有助于避免”到“可能有助于避免”的变化,以及关于每种风格如何“提供自己的权衡和好处”.format的蓬松、模棱两可的散文如何取代了对 f-strings的明确推荐。也就是说,不仅正式的弃用不再出现在卡片上,而且当前的文档公开承认格式化至少比其他方法有一些“好处”。%

我从这一切推断出,弃用或删除%格式的运动不仅步履蹒跚,而且被彻底和永久地击败。

于 2019-01-20T14:48:36.100 回答