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
风格的格式一直存在Template
类是在Python 2.4中引入的format
方法是在Python 2.6中引入的f
-strings是在Python 3.6中引入的我的问题是:
printf
样式格式是否已弃用或将被弃用?Template class
中,substitute
方法是否已被弃用或将被弃用? (我不是在谈论safe_substitute
,据我所知,它提供了独特的功能)类似的问题以及为什么我认为它们不重复:
printf
风格的方法甚至不会提高PendingDeprecationWarning
,所以这真的会被弃用吗?这篇文章也很陈旧,所以信息可能已经过时了。虽然文档中有各种迹象表明.format
和f-strings优于%
字符串,但没有幸存的计划可以弃用后者。
在提交Issue #14123: Explicitly mention that old style % string formatting has caveats but is not going away any time soon.,受问题Indicate that there are no current plans to deprecate printf-style formatting的启发,关于%
格式的文档被编辑为包含这个短语:
由于新的字符串格式化语法更灵活并且自然地处理元组和字典,因此建议使用新代码。但是,目前没有计划弃用printf样式的格式。
(强调我的。)
此短语后来在提交Close #4966: revamp the sequence docs in order to better explain the state of modern Python中删除。这可能看起来表明贬低%
格式的计划已经重新出现在卡片上......但是潜入bug追踪者会发现其意图恰恰相反。在错误跟踪器上,提交的作者描述了更改like this:
- 改变了描述printf风格格式与str.format方法之间关系的散文(故意删除前者有任何真正消失的危险 - 我们认真考虑将其删除是不切实际的)
换句话说,我们已经对%
格式化文档进行了两次连续更改,旨在明确强调它不会被弃用,更不用说删除了。文档仍然坚持不同类型的字符串格式的相对优点,但他们也清楚%
格式不会被弃用或删除。
更重要的是,2017年3月的most recent change to that paragraph改变了这一点......
这里描述的格式化操作表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字或
str.format
界面有助于避免这些错误。这些替代方案还提供了更强大,灵活和可扩展的格式化文本方法。
......对此:
这里描述的格式化操作表现出各种怪癖,导致许多常见错误(例如无法正确显示元组和字典)。使用较新的格式化字符串文字,
str.format
接口或模板字符串可以帮助避免这些错误。这些替代方案中的每一个都提供了它们自身的权衡和简单性,灵活性和/或可扩展性的益处。
请注意从“帮助避免”到“可能有助于避免”的变化,以及.format
和f-strings的明确建议如何被蓬松,模棱两可的散文取代,关于每种风格如何“提供自己的权衡和利益”。也就是说,不仅正式弃用不再是卡片,而且当前的文档公开承认%
格式化至少比其他方法有一些“好处”。
我从所有这些推断,贬低或删除%
格式的运动不仅动摇了,而且彻底彻底地被击败了。
新的.format()
method旨在取代旧的%
格式语法。后者已经不再强调,(但尚未正式弃用)。方法文档说明了:
这种字符串格式化方法是Python 3中的新标准,应该优先于新代码中
%
中描述的String Formatting Operations格式。
(强调我的)。
为了保持向后兼容性并使转换更容易,旧格式暂时保留。从原来的PEP 3101 proposal:
Backwards Compatibility
通过保留现有机制,可以保持向后兼容性。新系统不会与现有字符串格式化技术的任何方法名称冲突,因此两个系统可以共存,直到弃用旧系统为止。
请注意,直到弃用旧系统为止;它没有被弃用,但每当你编写新代码时都会使用新系统。
新系统的优势在于您可以结合旧%
格式化程序的元组和字典方法:
"{greeting}, {0}".format(world, greeting='Hello')
并且可以通过用于处理单个值格式的object.__format__()
钩子进行扩展。
请注意,旧系统具有%
和Template
类,后者允许您创建添加或更改其行为的子类。新式系统有Formatter
class填补相同的利基。
Python 3进一步放弃了弃用,而是在printf
-style String Formatting section中给你警告:
注意:此处描述的格式化操作表现出各种怪癖,这些怪癖会导致许多常见错误(例如无法正确显示元组和字典)。使用较新的formatted string literals或
str.format()
界面有助于避免这些错误。这些替代方案还提供了更强大,灵活和可扩展的格式化文本方法。
Python 3.6还添加了formatted string literals,它将表达式内联到格式字符串中。这是使用插值创建字符串的最快方法,并且应该在任何可以使用文字的地方使用str.format()
。
用于字符串格式化的%
运算符不会被弃用,并且不会被删除 - 尽管有其他答案。
每次在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.'
Guido的最新立场似乎在这里表明:
PEP 3101:字符串格式化的新方法
用于内置字符串格式化操作的新系统取代了%字符串格式化操作符。 (但是,%运算符仍然受支持;它将在Python 3.1中弃用,稍后将从语言中删除。)阅读PEP 3101以获取完整的独家新闻。
PEP3101本身,最近修改后的历史可以追溯到(2011年9月30日星期五),所以我认为最近没有进展。
查看较旧的Python文档和PEP 3101,有一个声明,%运算符将在以后被弃用并从语言中删除。 following statement是Python 3.0,3.1和3.2的Python文档:
由于str.format()很新,很多Python代码仍然使用%运算符。但是,因为最终将从语言中删除这种旧的格式化格式,所以通常应该使用str.format()。
如果你去Python 3.3和3.4文档中的same section,你会看到该语句已被删除。我也无法在文档中的任何其他位置找到任何其他声明,表明该操作符将被弃用或从该语言中删除。同样重要的是要注意PEP3101在两年半的时间里没有被修改(2011年9月30日星期五)。
更新
PEP461将%格式添加到字节和bytearray是可接受的,应该是Python 3.5或3.6的一部分。这是%运营商活着并且踢的另一个迹象。