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-style格式是否已被弃用? - 在中Template class,该substitute方法是否已弃用或将要弃用?(我不是在谈论safe_substitute,据我所知它提供了独特的功能)
类似的问题以及为什么我认为它们不是重复的:
Python字符串格式:%vs.format —仅处理方法1和2,并询问哪种方法更好;我的问题明确地是关于Python Zen的弃用
字符串格式选项:优点和缺点 -仅处理问题中的方法1a和1b,答案中的方法1和2,也不考虑弃用
高级字符串格式与模板字符串的比较 -主要是关于方法1和3的,并且没有解决过时的问题
字符串格式表达式(Python) -答案提到计划不推荐使用原始的’%’方法。但是计划要弃用,待定弃用和实际弃用之间有什么区别?而且printf-style方法甚至不会引发PendingDeprecationWarning,所以这真的会被弃用吗?该帖子也很旧,因此信息可能已过时。
新.format()方法旨在替代旧的%格式语法。后者已经不再强调,(但没有正式弃用尚未)。方法文档指出:
.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()任何可以使用文字的位置使用它,而不应使用它们。