str.format() vs str % str.format()是一种字符串格式化方法,它使用大括号{}作为占位符,并通过format()函数将相应的值传递进去。这种方法可以很灵活地控制字符串的格式。 str % 是另一种字符串格式化方法,它使用百分号%作为占位符,并通过%运算符将相应的值传递进去。这种方法是Python 2.x版本中常用的方式,但在Python 3.x版本中已经不推荐使用。 总的来说,str.format()更加灵活和易读,而且可以在不同位置使用相同的参数。而str % 在处理
str.format() vs str % str.format()是一种字符串格式化方法,它使用大括号{}作为占位符,并通过format()函数将相应的值传递进去。这种方法可以很灵活地控制字符串的格式。 str % 是另一种字符串格式化方法,它使用百分号%作为占位符,并通过%运算符将相应的值传递进去。这种方法是Python 2.x版本中常用的方式,但在Python 3.x版本中已经不推荐使用。 总的来说,str.format()更加灵活和易读,而且可以在不同位置使用相同的参数。而str % 在处理
Python有至少六种格式化字符串的方法:\n
In [1]: world = "Earth" # 方法1a In [2]: "Hello, %s" % world Out[2]: 'Hello, Earth' # 方法1b In [3]: "Hello, %(planet)s" % {"planet": world} Out[3]: 'Hello, Earth' # 方法2a In [4]: "Hello, {0}".format(world) Out[4]: 'Hello, Earth' # 方法2b In [5]: "Hello, {planet}".format(planet=world) Out[5]: 'Hello, Earth' # 方法2c In [6]: f"Hello, {world}" Out[6]: 'Hello, Earth' In [7]: from string import Template # 方法3 In [8]: Template("Hello, $planet").substitute(planet=world) Out[8]: 'Hello, Earth'
\n不同方法的简要历史:\n- `printf`风格的格式化自Python初始阶段就存在\n- `Template`类在Python 2.4中引入\n- `format`方法在Python 2.6中引入\n- `f`字符串在Python 3.6中引入\n我的问题是:\n- `printf`风格的格式化是否已被弃用或将被弃用?\n- 在`Template`类中,`substitute`方法是否已被弃用或将被弃用?(我指的不是`safe_substitute`,据我了解它提供了独特的功能)\n类似的问题及为何我认为它们不是重复问题:\n- [Python string formatting: % vs. .format](https://stackoverflow.com/q/5082452/974555) - 仅涉及方法1和方法2,并询问哪个更好;我的问题明确是关于在Python之禅的背景下是否弃用。\n- [String formatting options: pros and cons](https://stackoverflow.com/q/8395925/974555) - 仅涉及问题中的方法1a和1b,答案中涉及方法1和方法2,并且也没有涉及弃用问题。\n- [advanced string formatting vs template strings](https://stackoverflow.com/q/11630106/974555) - 主要涉及方法1和方法3,并且没有讨论弃用问题。\n- [String formatting expressions (Python)](https://stackoverflow.com/q/1763184/974555) - 回答中提到最初的`%`方法计划被弃用。但是,计划被弃用、待弃用和实际弃用有什么区别?而且`printf`风格的方法甚至没有引发`PendingDeprecationWarning`,那么它真的会被弃用吗?这篇文章也相当古老,所以信息可能已过时。\n另请参阅:\n- [PEP 502: String Interpolation - Extended Discussion](https://www.python.org/dev/peps/pep-0502/)\n- [String Formatter](https://docs.python.org/2/library/string.html#string.Formatter)
在旧版本的Python文档和PEP 3101中,有一份声明称百分号(%)操作符将在未来被弃用并从语言中移除。以下语句出现在Python 3.0、3.1和3.2的文档中:
“由于str.format()是相当新的功能,许多Python代码仍在使用%操作符。然而,由于这种旧式的格式化风格最终将从语言中移除,应该普遍使用str.format()。”
如果查看Python 3.3和3.4文档中的同一部分,你会发现该语句已被删除。我也无法在文档的其他地方找到任何关于该操作符将被弃用或从语言中移除的其他声明。值得注意的是,PEP3101在过去两年半(2011年9月30日)没有进行修改。
更新:
PEP461接受了将%格式化用于字节和字节数组的提案,并将成为Python 3.5或3.6的一部分。这是%操作符仍然活跃的另一个迹象。
根据上述内容,我们可以得出以下结论:
问题的出现原因:
根据旧版本Python文档和PEP 3101的声明,%操作符将被弃用并从语言中移除。这导致很多Python代码仍在使用%操作符进行字符串格式化。
解决方法:
然而,随着str.format()的引入,推荐使用这种新的格式化方法。尽管在Python 3.0、3.1和3.2的文档中明确指出%操作符将被移除,但在之后的文档以及PEP3101中并没有对此作出进一步的说明。此外,PEP461的接受也表明%操作符仍然存在并且在新的功能提案中继续使用。
尽管%操作符在过去被认为将被弃用和移除,但目前没有明确的证据表明这一操作符将被废弃。因此,作为Python开发者,我们可以根据实际情况选择使用%操作符或者str.format()进行字符串格式化。
在Python中,字符串格式化有两种常见的方法:使用%
操作符和使用.format
方法。尽管.format
方法在PEP 3101中被引入并被认为是更现代的方式,但%
操作符仍然被广泛使用并且不会被移除。
许多人对于使用哪种方式存在争议,但对于保留经典方式并没有争议。经典方式被认为简单、快速,适用于处理简单的字符串。相比之下,.format
方法并不总是更易读,即使在核心开发人员中,也有很少人可以不查看文档而熟练使用其完整语法。
即使在2009年,这个问题也已经引起了争议,但之后很少在讨论列表中出现。
在Python 3.6中引入了一种新的字符串插值方法,使用f""
作为前缀。通过在字符串前添加f
,字符串对象在运行时会调用一个方法,自动将当前作用域中的变量插入到字符串中。这种方式更加简洁和灵活。
需要注意的是,f-strings
是Python 3.6中的新特性,在之前的版本中是不存在的,会引发语法错误。此外,在f-strings
中不仅可以插入变量,还可以插入任意表达式,包括任意函数和代码。
虽然.format
方法被认为是更现代和灵活的方式,但%
操作符作为经典方式仍然被广泛使用,并且在Python开发中不会被移除。而Python 3.6中引入的f-strings
提供了一种更简洁和灵活的字符串插值方法。
Python中的字符串格式化有两种方法:str.format()和%格式化。新的str.format()方法旨在取代旧的%格式化语法。尽管旧的格式化语法尚未正式弃用,但它已被弱化。根据方法文档:
这种字符串格式化方法是Python 3中的新标准,在编写新代码时应优先使用,而不是使用在String Formatting Operations中描述的%格式化。
为了保持向后兼容性并使过渡更容易,旧的格式化方法被保留了下来。根据PEP 3101提案:
通过保留现有机制可以保持向后兼容性。
注意到"在它的时候来废弃旧的系统",它尚未被弃用,但新系统应该在编写新代码时使用。
新系统的优点是可以结合旧的%格式化的元组和字典方法,它通过object.__format__()钩子是可扩展的,用于处理单个值的格式化。
需要注意的是,旧系统有%和Template类,后者允许您创建添加或更改行为的子类。新式系统有Formatter类来填充相同的需求。
Python 3进一步摆脱了废弃,而是在printf-style String Formatting部分给出了警告:
注意:这里描述的格式化操作存在各种怪癖,导致一些常见错误(如无法正确显示元组和字典)。使用更新的格式化字符串字面值或str.format()接口有助于避免这些错误。这些替代方案还提供了更强大、灵活和可扩展的文本格式化方法。
Python 3.6还添加了formatted string literals,它将表达式内嵌到格式化字符串中。这是创建带有插值值的字符串的最快方法,应该在可以使用字面量的地方使用,而不是使用str.format()。
通过Formatter,您可以创建自定义格式,例如datetime对象使用的格式。此外,由于.format是一个函数,您可以直接使用它来创建可调用的延迟格式化,例如:fmt = '{} - {}'.format; fmt(a, b)。
我不认为Template与%或旧系统有关。特别是您链接的PEP中指出:虽然此提案与string.Template存在一些重叠,但人们认为每个都满足不同的需求,一个不会取代另一个。在您的回答中,人们可能会混淆Template格式化与旧系统一样,也被弃用了。
对,我想我错过了那部分。但是我认为Formatter类可以满足与string.Template()相同的需求。
[...]应优先使用.format而不是%格式化[...]此部分已从文档中删除。docs.python.org/3/library/stdtypes.html#str.format
我认为这个答案当前是误导性的;引用的第一段已从Python 3文档中删除,我认为没有任何暗示仍然有废弃的意图。这个答案仍然具有历史价值,但我倾向于修改措辞,以避免任何暗示废弃仍在考虑中,并将答案的前半部分改为过去时态。如果您不反对的话,我会在某个时候自己进行编辑,但我想先发表评论,给您一个机会对自己不同意的部分进行更改。
我不同意。这一段仍然在Python 2文档中。Python 2文档不是静态的,它仍然使用相同的措辞是有意义的,而且str.format()现在是默认的格式化方法。请注意,PEP也仍然使用相同的语言,未经修改。Python 3文档中的文本已经消失,因为已经重新设计并移动了旧的%文档,以减弱它的作用。
好的,我坚持我的批评意见;我认为你错误地阅读了Python 2文档中剩下的文字,我认为绝对不会有废弃的可能性,原因我在我的回答中给出了链接,其他回答中也给出了其他原因,但如果你不同意,我不会编辑以从根本上改变你的答案的含义。