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中引入的我的问题是:
printf
style格式被弃用或将被弃用?Template class
,substitute
方法是弃用还是将被弃用?(我不是在谈论safe_substitute
,据我所知,它提供了独特的功能)类似的问题以及为什么我认为它们不重复:
Python字符串格式:%vs. .format - 仅处理方法1和2,并询问哪一个更好; 我的问题是根据Python的Zen来明确地讨论弃用
字符串格式化选项:优点和缺点 - 仅处理问题中的方法1a和1b,答案中的1和2,以及关于弃用的任何内容
高级字符串格式与模板字符串 - 主要是关于方法1和3,并不涉及弃用
字符串格式化表达式(Python) - 回答提到原计划'%'方法计划不推荐使用.但计划弃用,待定弃用和实际弃用之间有什么区别?并且printf
-style方法甚至没有提高PendingDeprecationWarning
,所以这真的会被弃用吗?这篇文章也很陈旧,所以信息可能已经过时了.
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()
使用文字的任何地方.
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)
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的一部分.这是%运营商活着并且踢的另一个迹象.
尽管在文档中有各种迹象表明,.format
f字符串优于%
字符串,但尚无可行的方案来弃用后者。
在提交的问题#14123中:明确提到旧样式%字符串格式有一些警告,但不会很快消失。,受问题启发表示目前尚无弃用printf样式格式的计划,有关%
-formatting 的文档已被编辑为包含以下短语:
由于新的字符串格式语法更加灵活并且可以自然地处理元组和字典,因此建议将其用于新代码。但是,目前没有废弃过printf样式格式的计划。
(强调我的。)
此短语稍后在commit Close#4966中删除:修改序列文档,以更好地解释现代Python的状态。这看起来似乎是一个不再使用%
格式化的计划的信号……但是,深入研究Bug跟踪器后,发现其意图恰恰相反。在错误跟踪器上,提交的作者将更改描述为如下特征:
- 更改了描述printf样式格式和str.format方法之间关系的散文(故意消除了前者可能会消失的真正危险的暗示-认真考虑将其销毁是不切实际的)
换句话说,我们对%
-formatting文档进行了两次连续更改,旨在明确强调它不会被弃用,更不用说删除了。该文档仍然对不同类型的字符串格式的相对优点持保留意见,但他们也很清楚- %
格式不会被弃用或删除。
更重要的是,该段落的最新更改是在2017年3月,将其从此更改为...
此处描述的格式化操作表现出各种古怪,这些古怪会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或
str.format
接口有助于避免这些错误。这些替代方法还提供了更强大,灵活和可扩展的文本格式设置方法。
...对此:
此处描述的格式化操作表现出各种古怪,这些古怪会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字,
str.format
接口或模板字符串可能有助于避免这些错误。这些选择中的每一个都提供了自己的权衡,并带来了简单性,灵活性和/或可扩展性的好处。
请注意,从“避免使用帮助”到“可以避免使用”的变化,以及关于.format
f字符串的清晰建议如何被蓬松,模棱两可的散文所取代,有关每种样式如何“提供自己的取舍和好处”。也就是说,不仅不再正式弃用卡片,而且当前的文档公开承认%
格式至少比其他方法具有一些“好处”。
我从所有这一切推断出,弃用或删除%
格式的运动不仅步履蹒跚,而且被彻底永久地击败。
归档时间: |
|
查看次数: |
18697 次 |
最近记录: |