Python';有多种字符串格式设置方法—;旧的会被弃用吗?
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]:
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'
不同方法的简要历史:
-自Pythons诞生以来,样式格式就一直存在printf
- Python 2.4中引入了
类模板
- Python 2.6中引入了
方法格式
-字符串是在Python 3.6中引入的f
样式格式是否已弃用或即将弃用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将被弃用