pythonsstring格式化的许多方法 – 是旧的(将被)不赞成?

Python至less有五种格式化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' In [6]: from string import Template # method 3 In [7]: Template("Hello, $planet").substitute(planet=world) Out[7]: 'Hello, Earth' 

不同方法的简要历史:

  • 从Pythons的婴儿期开始, printf风格的格式化就已经出现了
  • Template类是在Python 2.4中引入的
  • format方法是在Python 2.6中引入的

我的问题是:

  • printf式样的格式不推荐使用或将被弃用?
  • Template classsubstitute方法是否substitute弃用或将被弃用? (我不是在谈论safe_substitute ,据我所知它提供了独特的function)

类似的问题,为什么我认为他们不重复:

  • Pythonstring格式化:%vs. .format – 仅处理方法1和2,并询问哪一个更好; 我的问题是明确地根据Python的禅宗来贬低

  • string格式化选项:优点和缺点 – 只处理问题中的方法1a和1b,答案中的1和2,也没有关于弃用

  • 高级string格式vs模板string – 主要是方法1和3,并没有解决折旧问题

  • string格式化expression式(Python) – 回答提到原来的'%'方法计划被弃用 。 但计划弃用待弃用和实际弃用之间有什么区别? 而且printf风格的方法不会引发一个PendingDeprecationWarning ,所以这真的会被弃用? 这个post也挺老的,所以信息可能已经过时了。

编辑:

看来,从Python 3.6开始,通过PEP 0498,还会有另一种方法: string插值 。

另请参阅PEP 502:string插值 – 扩展讨论

新的.format()方法旨在replace旧的%格式化语法。 后者已经不再强调了(但尚未正式弃用)。 方法文档声明如下:

这种string格式化方法是Python 3中的新标准, 应优先于新代码中string格式化操作中描述的%格式。

(强调我的)。

为了保持向后兼容性并使转换更容易,旧格式现在已经存在 。 从原来的PEP 3101build议 :

向后兼容性

向后兼容性可以通过保留现有的机制来维持。 新系统不会与现有string格式化技术的任何方法名称相冲突,因此两个系统可以共存,直到需要弃用旧系统。

注意, 直到需要弃用旧的系统 ; 它并没有被弃用,但是当你写新的代码时,新的系统将被使用。

新系统有一个好处,就是可以旧格式化程序的元组和字典结合起来

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

并且可以通过object.__format__()钩子来扩展,用于处理单个值的格式。

请注意,旧系统有%Template类,后者允许您创build添加或改变其行为的子类。 新风格的系统具有Formatter类来填充相同的利基。

string格式化的%操作符不被弃用,不会被删除 – 尽pipe有其他答案。
每一次在Python开发名单上提出这个问题,关于是否取消经典的方式,哪一个更好,但是没有争议,这个争论会留下来。 尽pipe在PEP 3101上表示,Python 3.1已经过去了, %格式化仍在。

保持经典风格的陈述很明确:简单,快捷,做短事快。 使用.format方法并不总是更具可读性 – 即使在核心开发人员中,也几乎没有人可以使用.format提供的完整语法,而无需查看参考。即使在2009年,也有这样的消息: http: //mail.python.org/pipermail/python-dev/2009-October/092529.html – 这个主题几乎没有出现在列表中。

2016年更新

在当前的Python开发版本(将变成Python 3.6)中,还有第三种string插值方法,在PEP-0498中有描述。 它定义了一个新的引用前缀f"" (除了当前的u""b""r"" )。

在string前添加一个string将在运行时调用string对象的方法,该方法会自动将当前作用域的variables插入到string中:

 >>> value = 80 >>> f'The value is {value}.' 'The value is 80.' 

看看较老的Python文档和PEP 3101,有一个声明,%运算符将被弃用,并在将来从语言中删除。 以下语句位于Python 3.0,3.1和3.2的Python文档中:

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

如果你使用Python 3.3和3.4文档的相同部分 ,你会看到这个语句已经被删除。 我也无法在文档的其他地方find任何其他语句,表明操作员将被折旧或从语言中删除。 同样重要的是要注意PEP3101在两年半之后还没有被修改(2011年9月30日星期五)。

更新

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

圭多在这方面的最新立场似乎在这里指出:

Python 3.0中的新function

PEP 3101:string格式化的新方法

用于内置string格式操作的新系统replace了%string格式操作符。 (但是,%运算符仍然受支持,它将在Python 3.1中被弃用,稍后将从语言中删除。)请阅读PEP 3101以获取全文。

而且PEP3101本身的最后修改时间可以追溯到(2011年9月30日,星期五),所以我认为在这一点上最近还没有进展。