Python has at least six ways of formatting a string:
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'
A brief history of the different methods:
printf
-style formatting has been around since Pythons infancy
- The
Template
class was introduced in Python 2.4
- The
format
method was introduced in Python 2.6
f
-strings were introduced in Python 3.6
My questions are:
- Is
printf
-style formatting deprecated or going to be deprecated?
- In the
Template class
, is the substitute
method deprecated or going to be deprecated? (I'm not talking about safe_substitute
, which as I understand it offers unique capabilities)
Similar questions and why I think they're not duplicates:
Python string formatting: % vs. .format — treats only methods 1 and 2, and asks which one is better; my question is explicitly about deprecation in the light of the Zen of Python
String formatting options: pros and cons — treats only methods 1a and 1b in the question, 1 and 2 in the answer, and also nothing about deprecation
advanced string formatting vs template strings — mostly about methods 1 and 3, and doesn't address deprecation
String formatting expressions (Python) — answer mentions that the original '%' approach is planned to be deprecated. But what's the difference between planned to be deprecated, pending deprecation and actual deprecation? And the printf
-style method doesn't raise even a PendingDeprecationWarning
, so is this really going to be deprecated? This post is also quite old, so the information may be outdated.
See also
- PEP 502: String Interpolation - Extended Discussion
- String Formatter
虽然在该文档的各种指示.format
和F-字符串优于%
弦,还有永远弃用后者没有幸存的计划。
在提交问题#14123:明确提到,旧式%字符串格式化了警告,但不会很快消失的任何时间。 按问题的启发表明,目前没有计划弃用printf风格的格式 ,对文档%
-formatting进行编辑,以包含这句话:
作为新的字符串格式化语法是更灵活,处理的元组和字典自然,建议对新代码。 然而, 目前没有计划,不建议使用printf风格的格式 。
(重点煤矿。)
这句话后来被删除,在提交关闭#4966:重整程序的文档,以便更好地解释现代的Python的状态 。 这似乎是一个迹象,表明计划弃用%
格式化就回到了卡......但潜入bug跟踪系统显示,意图是相反的。 在bug跟踪系统,对犯笔者特征的变化是这样 :
- 改变描述printf风格的格式和str.format方法(故意去掉暗示前者是消失的任何真正的危险 - 这是不实际为我们认真考虑杀死它关闭)之间的关系的散文
换句话说,我们不得不连续两次变化%
预期-formatting文件明确强调 ,它不会被弃用,更不用说删除。 该文档仍然对不同类型的字符串格式的相对优势坚持己见,但他们也清楚%
-formatting不会得到过时或删除。
更重要的是,在最近的该段的变化 ,在2017年三月,改从这个...
这里所描述的格式化操作表现出各种怪癖导致一些常见错误(如未能正确显示的元组和词典)的。 使用新的格式化字符串文字或str.format
接口有助于避免这些错误。 这些方案还提供了更强大,灵活和可扩展的方法来格式化文本。
......这样的:
这里所描述的格式化操作表现出各种怪癖导致一些常见错误(如未能正确显示的元组和词典)的。 使用新的格式化字符串文字的str.format
接口,或模板字符串可能有助于避免这些错误。 所有这些替代方案的提供自己的权衡和简便性,灵活性,和/或可扩展性的好处。
注意改变从“有助于避免”为“可能有助于避免”,以及如何的明确建议.format
和F-串已经换成蓬松,模棱两可的散文关于每种风格如何“提供了自己的权衡和利益”。 也就是说,不仅是一个正式弃用上牌不再,但目前的文档是公开承认%
格式至少有超过其它方法的一些“好处”。
我会从所有这一切的运动弃用或删除推断%
格式不仅动摇,但被彻底并永久击败。
新.format()
方法是为了取代旧%
格式的语法。 后者已经不再强调,(但尚未正式弃用)。 该方法文档指出之多:
字符串格式化的这种方法是在Python 3的新标准,并应优先于%
中所描述的格式字符串格式化操作在新的代码。
(重点煤矿)。
为了保持向后兼容性,并让您更容易过渡,旧格式已经被留在原地现在 。 从最初的PEP 3101建议 :
向后兼容性
向后兼容可以通过保留现有机制,在维护。 新系统不与任何现有的字符串格式化技术方法名的碰撞,所以这两个系统可以共存,直到它的时间弃用的旧系统。
请注意,直到它的时间弃用的旧系统 ; 它没有被弃用,但新系统是用来当你编写新的代码 。
新系统具有作为好处是可以结合的元组和旧的字典方法%
格式:
"{greeting}, {0}".format(world, greeting='Hello')
并且是通过可扩展的object.__format__()
用于处理单独的值的格式钩。
需要注意的是旧系统有%
和Template
类,后者允许您创建添加或更改其行为的子类。 该新型系统具有Formatter
类 ,以填补相同的利基。
Python 3中进一步加强从弃用了,而不是给你的警告printf
风格的字符串格式化部分 :
注意 :此处描述的格式化操作表现出各种怪癖导致一些常见错误(如未能正确显示的元组和词典)的。 使用新的格式化字符串文字或str.format()
接口有助于避免这些错误。 这些方案还提供了更强大,灵活和可扩展的方法来格式化文本。
蟒3.6也加入格式化字符串文字 ,这在线的表达式入格式字符串。 这些是插值创建字符串的最快速的方法,而且应该用来代替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.'
圭多对这一最新表态似乎是在此间表示:
有什么新的Python 3.0
PEP 3101:一种新的方法字符串格式化
对于内置的字符串格式化操作的新系统替换%字符串格式化操作。 (然而,%运算符仍然支持,它会在Python 3.1被淘汰,并从在一段时间以后的语言被删除。)阅读PEP 3101的勺子。
而PEP3101本身,它有最后的修改可以追溯到(周五,30 2011年9月),从而对一个迟到没有进步,我想。
望着老的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的一部分。 这是另一个迹象,表明%操作是活蹦乱跳。
文章来源: Python's many ways of string formatting — are the older ones (going to be) deprecated?