Python的很多字符串格式化的方式 - 都是老的(将要)已过时?(Python's man

2019-06-21 05:40发布

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

Answer 1:

虽然在该文档的各种指示.format和F-字符串优于%弦,还有永远弃用后者没有幸存的计划。

在提交问题#14123:明确提到,旧式%字符串格式化了警告,但不会很快消失的任何时间。 按问题的启发表明,目前没有计划弃用printf风格的格式 ,对文档% -formatting进行编辑,以包含这句话:

作为新的字符串格式化语法是更灵活,处理的元组和字典自然,建议对新代码。 然而, 目前没有计划,不建议使用printf风格的格式

(重点煤矿。)

这句话后来被删除,在提交关闭#4966:重整程序的文档,以便更好地解释现代的Python的状态 。 这似乎是一个迹象,表明计划弃用%格式化就回到了卡......但潜入bug跟踪系统显示,意图是相反的。 在bug跟踪系统,对犯笔者特征的变化是这样 :

  • 改变描述printf风格的格式和str.format方法(故意去掉暗示前者是消失的任何真正的危险 - 这是不实际为我们认真考虑杀死它关闭)之间的关系的散文

换句话说,我们不得不连续两次变化%预期-formatting文件明确强调 ,它不会被弃用,更不用说删除。 该文档仍然对不同类型的字符串格式的相对优势坚持己见,但他们也清楚% -formatting不会得到过时或删除。

更重要的是,在最近的该段的变化 ,在2017年三月,改从这个...

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

......这样的:

这里所描述的格式化操作表现出各种怪癖导致一些常见错误(如未能正确显示的元组和词典)的。 使用新的格式化字符串文字的str.format接口,或模板字符串可能有助于避免这些错误。 所有这些替代方案的提供自己的权衡和简便性,灵活性,和/或可扩展性的好处。

注意改变从“有助于避免”为“可能有助于避免”,以及如何的明确建议.format和F-串已经换成蓬松,模棱两可的散文关于每种风格如何“提供了自己的权衡和利益”。 也就是说,不仅是一个正式弃用上牌不再,但目前的文档是公开承认%格式至少有超过其它方法的一些“好处”。

我会从所有这一切的运动弃用或删除推断%格式不仅动摇,但被彻底并永久击败。



Answer 2:

.format()方法是为了取代旧%格式的语法。 后者已经不再强调,(但尚未正式弃用)。 该方法文档指出之多:

字符串格式化的这种方法是在Python 3的新标准,并应优先%中所描述的格式字符串格式化操作在新的代码。

(重点煤矿)。

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

向后兼容性

向后兼容可以通过保留现有机制,在维护。 新系统不与任何现有的字符串格式化技术方法名的碰撞,所以这两个系统可以共存,直到它的时间弃用的旧系统。

请注意,直到它的时间弃用的旧系统 ; 它没有被弃用,但新系统是用来当你编写新的代码

新系统具有作为好处是可以结合的元组和旧的字典方法%格式:

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

并且是通过可扩展的object.__format__()用于处理单独的值的格式钩。

需要注意的是旧系统有%Template类,后者允许您创建添加或更改其行为的子类。 该新型系统具有Formatter类 ,以填补相同的利基。

Python 3中进一步加强从弃用了,而不是给你的警告printf风格的字符串格式化部分 :

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

蟒3.6也加入格式化字符串文字 ,这在线的表达式格式字符串。 这些是插值创建字符串的最快速的方法,而且应该用来代替str.format()的地方,您可以使用文字。



Answer 3:

%字符串格式化操作不会被弃用,并且不会被删除-尽管其他的答案。
主题是在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.'


Answer 4:

圭多对这一最新表态似乎是在此间表示:

有什么新的Python 3.0

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

对于内置的字符串格式化操作的新系统替换%字符串格式化操作。 (然而,%运算符仍然支持,它会在Python 3.1被淘汰,并从在一段时间以后的语言被删除。)阅读PEP 3101的勺子。

而PEP3101本身,它有最后的修改可以追溯到(周五,30 2011年9月),从而对一个迟到没有进步,我想。



Answer 5:

望着老的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?