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

ger*_*rit 96 python printf string-formatting backwards-compatibility deprecated

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'
Run Code Online (Sandbox Code Playgroud)

不同方法的简要历史:

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

我的问题是:

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

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

另见PEP 502:字符串插值 - 扩展讨论

Mar*_*ers 55

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

字符串格式化的这种方法是在Python 3的新标准,并应首选%描述格式字符串格式化操作在新的代码.

(强调我的).

为了保持向后兼容性,并让您更容易过渡,旧格式已经被留在原地现在.从最初的PEP 3101提案:

向后兼容性

通过保留现有机制,可以保持向后兼容性.新系统不会与现有字符串格式化技术的任何方法名称冲突,因此两个系统可以共存,直到弃用旧系统为止.

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

新系统的优势在于您可以结合%格式化程序的元组和字典方法:

"{greeting}, {0}".format(world, greeting='Hello')
Run Code Online (Sandbox Code Playgroud)

并且可以通过object.__format__()用于处理各个值的格式化的钩子进行扩展.

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

Python 3进一步放弃了弃用,而是在printf-style String Formatting部分给出警告:

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

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

  • 使用`Formatter`,您可以创建自定义格式,例如`datetime`对象使用的格式.此外,由于`.format`是一个函数,您可以使用它来更直接地创建可调用的延迟格式:例如,`fmt ='{} - {}'.format; fmt(a,b)` (4认同)
  • `[...] 应该优先于 % 格式[...]` 这部分已从文档中删除。https://docs.python.org/3/library/stdtypes.html#str.format (2认同)

jsb*_*eno 44

%字符串格式化的运算符不会被弃用,并且不会被删除 - 尽管有其他答案.
每次在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.'
Run Code Online (Sandbox Code Playgroud)

  • 允许类型实现自己的`__format__`要好得多.例如,`format(十进制('0.1'),'.20f')`vs`'%.20f'%十进制('0.1')`.后者将Decimal强制转换为浮点数. (3认同)
  • NB.我并不认为旧式在各方面都更好 - 只是它更短,有时更具可读性(有时候不是).当然,新方式更灵活. (2认同)

小智 20

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

Python 3.0中有什么新功能

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

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

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


Mar*_*agh 18

查看较旧的Python文档和PEP 3101,有一个声明,%运算符将在以后被弃用并从语言中删除.在下面的语句是在Python文档的Python 3.0,3.1和3.2:

由于str.format()很新,很多Python代码仍然使用%运算符.但是,因为最终将从语言中删除这种旧格式化格式,所以通常应该使用str.format().

如果您在Python 3.3和3.4文档中转到相同的部分,您将看到该语句已被删除.我也无法在文档中的任何其他位置找到任何其他声明,表明该操作符将被弃用或从该语言中删除.同样重要的是要注意PEP3101在两年半的时间内没有被修改(2011年9月30日星期五).

更新

PEP461将%格式添加到字节和bytearray是可接受的,应该是Python 3.5或3.6的一部分.这是%运营商活着并且踢的另一个迹象.


Mar*_*ery 9

尽管在文档中有各种迹象表明,.formatf字符串优于%字符串,但尚无可行的方案来弃用后者。

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

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

(强调我的。)

此短语稍后在commit Close#4966中删除:修改序列文档,以更好地解释现代Python的状态。这看起来似乎是一个不再使用%格式化的计划的信号……但是,深入研究Bug跟踪器后,发现其意图恰恰相反。在错误跟踪器上,提交的作者将更改描述为如下特征:

  • 更改了描述printf样式格式和str.format方法之间关系的散文(故意消除了前者可能会消失的真正危险的暗示-认真考虑将其销毁是不切实际的)

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

更重要的是,该段落的最新更改是在2017年3月,将其从此更改为...

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

...对此:

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

请注意,从“避免使用帮助”到“可以避免使用”的变化,以及关于.formatf字符串的清晰建议如何被蓬松,模棱两可的散文所取代,有关每种样式如何“提供自己的取舍和好处”。也就是说,不仅不再正式弃用卡片,而且当前的文档公开承认%格式至少比其他方法具有一些“好处”。

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

  • 添加了蓬松的语言更改,以使Mercurial维护人员(以及其他一些人)安心,他们不想看到Mercurial留下的代码库太大而无法消除对%%的使用。现在,“无大规模代码修改”政策已被取消,他们的反对意见也正在逐渐消失。从长远来看,维持这两种形式都不会为%%带来任何好处**在某些时候,无论如何都会删除printf语法。我们只是不知道什么时候,所以该语言值得淡化。 (2认同)