一尘不染

Python的字符串格式化的许多方式-较旧的(即将被淘汰)吗?

python

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自从Python诞生以来,就一直存在样式样式的格式化
  • 该Template班是在Python 2.4中引入
  • 该format方法在Python 2.6中引入
  • f-strings是在Python 3.6中引入的

我的问题是:
- printf-style格式是否已被弃用?
- 在中Template class,该substitute方法是否已弃用或将要弃用?(我不是在谈论safe_substitute,据我所知它提供了独特的功能)

类似的问题以及为什么我认为它们不是重复的:

  • Python字符串格式:%vs.format —仅处理方法1和2,并询问哪种方法更好;我的问题明确地是关于Python Zen的弃用

  • 字符串格式选项:优点和缺点 -仅处理问题中的方法1a和1b,答案中的方法1和2,也不考虑弃用

  • 高级字符串格式与模板字符串的比较 -主要是关于方法1和3的,并且没有解决过时的问题

  • 字符串格式表达式(Python) -答案提到计划不推荐使用原始的’%’方法。但是计划要弃用,待定弃用和实际弃用之间有什么区别?而且printf-style方法甚至不会引发PendingDeprecationWarning,所以这真的会被弃用吗?该帖子也很旧,因此信息可能已过时。


阅读 548

收藏
2020-02-18

共1个答案

一尘不染

.format()方法旨在替代旧的%格式语法。后者已经不再强调,(但没有正式弃用尚未)。方法文档指出:

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

(强调我的)。

为了保持向后兼容性,并让你更容易过渡,旧格式已经被留在原地现在。根据最初的PEP 3101提案:

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

请注意,直到该淘汰旧系统为止;尚未弃用,但是只要你编写新代码,都将使用新系统。

新系统的一个优点是你可以结合使用旧%格式化程序的元组和字典方法:

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

并且可以通过object.format()用于处理各个值格式的钩子进行扩展。

请注意,旧系统具有%和Template类,后者允许你创建添加或更改其行为的子类。新型系统具有填充相同细分市场的Formatter类别。

Python 3进一步放弃了弃用,而是在printf-style String Formatting部分中向你发出警告:

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

Python 3.6还添加了格式化的字符串文字,将表达式内联到格式字符串中。这些是使用内插值创建字符串的最快方法,因此应在str.format()任何可以使用文字的位置使用它,而不应使用它们。

2020-02-18