printf - Python的许多字符串格式化方法 - 旧的(将要)被弃用了吗?

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'

不同方法的简要历史:

  • 自Pythons婴儿期以来,printf风格的格式一直存在
  • printf类是在Python 2.4中引入的
  • printf方法是在Python 2.6中引入的
  • printf-strings在Python 3.6中引入

我的问题是:

  • 是否已弃用或将弃用printf样式的格式?
  • printf中,是否已弃用或将弃用PendingDeprecationWarning方法? (我不是在谈论safe_substitute,据我所知,它提供了独特的功能)

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

  • Python字符串格式:%vs. .format - 仅处理方法1和2,并询问哪一个更好; 我的问题是根据Python的Zen来明确地讨论弃用

  • 字符串格式化选项:优点和缺点 - 仅处理问题中的方法1a和1b,答案中的1和2,以及关于弃用的任何内容

  • 高级字符串格式与模板字符串 - 主要是关于方法1和3,并不涉及弃用

  • 字符串格式化表达式(Python) - 回答提到原计划'%'方法计划不推荐使用。 但计划弃用,待定弃用和实际弃用之间有什么区别? 并且printf风格的方法甚至不会提高PendingDeprecationWarning,所以这真的会被弃用吗? 这篇文章也很陈旧,所以信息可能已经过时了。

也可以看看

  • PEP 502:字符串插值 - 扩展讨论
  • String Formatter
5个解决方案
53 votes

新的str.format()方法旨在替换旧的str.format()格式语法。 后者已经不再强调,(但尚未正式弃用)。 方法文档说明了:

这种字符串格式化方法是Python 3中的新标准,应该优先于新代码中字符串格式化操作中描述的str.format()格式。

(强调我的)。

为了保持向后兼容性并使转换更容易,旧格式暂时保留。 从最初的PEP 3101提案:

向后兼容性

离开现有的可以保持向后兼容性   机制到位。 新系统不会与任何一个系统发生冲突   现有字符串格式化技术的方法名称,所以   这两个系统可以共存,直到废弃它为止   旧系统。

请注意,直到弃用旧系统为止; 它没有被弃用,但每当你编写新代码时都会使用新系统。

新系统的优势在于您可以结合旧的str.format()格式化程序的元组和字典方法:

"{greeting}, {0}".format(world, greeting='Hello')

并且可以通过用于处理单个值格式的str.format()钩子进行扩展。

请注意,旧系统具有str.format()Template类,后者允许您创建添加或更改其行为的子类。 新式系统有str.format()类填补相同的利基。

Python 3进一步放弃了弃用,而是在str.format()样式的字符串格式化部分给出警告:

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

Python 3.6还添加了格式化的字符串文字,将表达式内联到格式字符串中。 这些是使用插值创建字符串的最快方法,应该在任何可以使用文字的地方使用而不是str.format()

Martijn Pieters answered 2019-09-10T08:37:56Z
44 votes

用于字符串格式的f运算符不会被弃用,并且不会被删除 - 尽管有其他答案。
每次在Python开发列表中提出主题时,都会有更强烈的争议,但是对于是否删除经典方式没有争议 - 它会留下来。 尽管在PEP 3101上表示,Python 3.1已经过去了,u""格式仍然存在。

保持经典风格的陈述是清楚的:它很简单,速度快,可以快速做短事。 使用f方法并不总是更具可读性 - 几乎没有人 - 即使在核心开发人员中,也可以使用u""提供的完整语法,而无需查看参考  即使在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.'
jsbueno answered 2019-09-10T08:38:56Z
19 votes

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

Python 3.0中有什么新功能

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

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

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

GSP answered 2019-09-10T08:39:48Z
19 votes

查看较旧的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将%格式添加到字节和bytearray是可接受的,应该是Python 3.5或3.6的一部分。 这是%运营商活着并且踢的另一个迹象。

Marwan Alsabbagh answered 2019-09-10T08:40:37Z
4 votes

虽然文档中有各种迹象表明.format和f字符串优于%字符串,但没有幸存的计划可以弃用后者。

在提交问题#14123中:明确提到旧样式%字符串格式有警告,但不会很快消失。受问题的启发表明目前没有计划弃用printf样式格式,%格式的文档是 编辑以包含此短语:

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

(强调我的。)

这个短语后来被删除,在提交关闭#4966:修改序列文档,以便更好地解释现代Python的状态。 这可能看起来似乎表明贬值%格式的计划已经重新出现在卡片上...但潜入错误跟踪器后发现其意图恰恰相反。 在错误跟踪器上,提交的作者将此更改描述为:

  • 改变了描述printf风格格式与str.format方法之间关系的散文(故意删除前者有任何真正消失的危险 - 我们认真考虑将其删除是不切实际的)

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

更重要的是,2017年3月对该段的最新修改改变了这一点......

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

......对此:

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

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

我从这一切推断,弃用或删除%格式的动作不仅动摇了,而且彻底彻底地被击败了。

Mark Amery answered 2019-09-10T08:36:10Z
translate from https://stackoverflow.com:/questions/13451989/pythons-many-ways-of-string-formatting-are-the-older-ones-going-to-be-depre