Python';有多种字符串格式设置方法—;旧的会被弃用吗?

Python';有多种字符串格式设置方法—;旧的会被弃用吗?,python,printf,string-formatting,deprecated,backwards-compatibility,Python,Printf,String Formatting,Deprecated,Backwards Compatibility,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]:

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
    -自Pythons诞生以来,样式格式就一直存在
  • Python 2.4中引入了
    模板
  • Python 2.6中引入了
    格式
    方法
  • f
    -字符串是在Python 3.6中引入的
我的问题是:

  • printf
    样式格式是否已弃用或即将弃用
  • 模板类
    中,
    替换
    方法是否已弃用或即将弃用?(我不是说
    safe\u substitute
    ,据我所知,它提供了独特的功能)
类似的问题以及为什么我认为它们不是重复的:

  • -只处理方法1和2,并询问哪一种更好;我的问题是根据Python的禅宗明确地提出反对意见

  • -只处理问题中的方法1a和1b,回答中的方法1和2,也不处理反对意见

  • -主要是关于方法1和方法3,不涉及弃用

  • -answer提到计划弃用原始“%”方法。但计划弃用、未决弃用和实际弃用之间有什么区别?而且
    printf
    -风格的方法甚至不会引发
    PendingDeprecationWarning
    ,所以这真的会被弃用吗?这篇文章也很老,所以信息可能已经过时了

另见
新语法旨在取代旧的
%
格式语法。后者已被淡化(但官方尚未反对)。方法文档说明如下:

这种字符串格式化方法是Python 3中的新标准,应该优先于新代码中描述的
%
格式

(我的重点)

为了保持向后兼容性并使转换更容易,旧格式暂时保留。原文:

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

请注意,在弃用旧系统之前;它还没有被弃用,但无论何时编写新代码,都将使用新系统

新系统的一个优点是,您可以将旧的
%
格式化程序的元组和字典方法结合起来:

"{greeting}, {0}".format(world, greeting='Hello')
并且可以通过
对象进行扩展。\uuuuu format\uuuu()
钩子用于处理单个值的格式设置

请注意,旧系统有
%
模板
类,后者允许您创建添加或更改其行为的子类。新型系统有能力填补同样的空缺

Python3进一步远离了弃用,而是在

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


Python3.6还添加了一个函数,它将表达式串联成字符串格式。这是使用插值创建字符串的最快方法,应该在任何可以使用文字的地方使用,而不是使用
str.format()

Guido对此的最新立场如下所示:

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

用于内置字符串格式化操作的新系统取代了 %字符串格式运算符。(但是,%运算符仍然为空。) 支持;它将在Python 3.1中被弃用,并从 阅读PEP 3101获取完整独家新闻


而其本身,其最后一次修改可追溯到(2011年9月30日,星期五),因此,我想,到目前为止,在这方面没有任何进展。

字符串格式的
%
运算符没有被弃用,也不会被删除-尽管有其他答案。
每次Python开发列表中提到这个主题时,都会有关于哪个更好的强烈争议,但对于是否删除经典方式——它将继续存在——没有争议。尽管在PEP 3101上有标记,Python 3.1还是来了又走了,而且
%
格式仍然存在

保持经典风格的说法很明确:简单、快速、快速地完成短小的事情。使用
.format
方法并不总是更具可读性,甚至在核心开发人员中,几乎没有人可以使用
.format
提供的完整语法,而无需查看参考 即使是在2009年,也有这样的信息:从那时起,这个主题几乎没有出现在列表中

2016年更新

在当前的Python开发版本(将成为Python 3.6)中,有第三种字符串插值方法,如所述。它定义了一个新的引号前缀
f”“
(除了当前的
u”“
b”“
r”“

f
作为字符串前缀将在运行时调用字符串对象上的方法,该方法将自动将当前范围内的变量插入字符串:

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

在查看较旧的Python文档和PEP 3101时,有一条声明说%operator将被弃用