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 class
,substitute
方法是否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日,星期五),所以我认为在这一点上最近还没有进展。