【问题标题】:Why are there so many formatting flavours in Python?为什么 Python 中有这么多格式化风格?
【发布时间】:2018-03-10 14:43:49
【问题描述】:

我最近看了一个 Python 教程,其中作者一直在玩各种 Python 字符串格式化表达式,我被一个想法打动了:

为什么 Python 中有这么多字符串格式化风格?

  • 有基于 C 语言 printf 的方法(顺便说一下,在各种来源中,该方法被引用为已弃用并计划删除,但标准 Python 文档中有大量示例 (!))。李>
  • 另一方面,有C# 派生的.format() 处理字符串的方式。
  • 最后,随着 Python 3.6 的出现,我们得到了formatted f-string literal,即f-string
  • 有些还包括string 模块,但这对我来说似乎有点过头了。

我发现here,根据用途,上述前两种技术既不同又相互重叠。

最后但并非最不重要的一点是,这种丰富的方法是否与 Python 在import this 中的声明之一相矛盾?

应该有一种——最好只有一种——明显的方法。

如果我错了,请纠正我,但这在某种程度上本质上是“非 Pythonic”。

读者是否会就此提出他们的想法,最好用一些相关的例子来支持?

【问题讨论】:

  • 这是一种进化。旧的方法被认为是不够的,因此发明了新的方法。 Python 的口头禅不应该禁止进步和改进。
  • prinf 已被弃用,我从不知道它存在。
  • 它们不是同时介绍的。离得很远。我认为向后兼容性非常重要
  • f"…" 使用了和.format() 相同的格式字符串,所以实际上只有两种格式字符串。引入.format 后的初衷是要弃用 %-formatting,但那并没有发生。 (这很好。)
  • 默认情况下向 Unicode 的转变反映了行业内更广泛的运动。一方面,Java 采用了它,这有助于巩固标准。对于 3.6,这是唯一的方法,将 2-3.6 视为过渡期。

标签: python python-3.x string-formatting


【解决方案1】:

这就是进化的样子。

“我们需要字符串连接”。

当然。 "hello" + ''' ''' + 'world' 或者,如果你愿意,' '.join(['hello', 'world'])

“但是"found " + str(var) + " matches" 有点笨拙。我听说Lisp 有princ...?”

好的,这里:'found %i matches' % var

(...时间流逝...)

“我听说你正在彻底检查整个语言并将print 变成一个函数。喘气!我们也可以修复这个字符串格式化的东西吗,毕竟这很疯狂?新手不明白为什么你在插值时需要括号不止一个变量,实际上,覆盖字符串的模运算符是一件非常古怪的事情。”

嗯,你是对的,好的,在这里。 'found {0} matches'.format(var) 是的,让我们摆脱这种不直观的复杂性。我们不希望模数成为一种特殊情况,它不优雅。

“谢谢。但是......等等,确实有很多代码使用旧语法,当你比较它们时,新语法真的很笨拙。”

啊。我们可以让它不那么笨拙。有一些语法糖! f'found {var} matches' 还有更多来自哪里!

“嗯,我不知道。模数仍然更容易输入。”

你快把我逼疯了。好的,喜欢的可以玩一下。但不要说我没有警告过你。

【讨论】:

    【解决方案2】:

    https://docs.python.org/2/whatsnew/2.6.html#pep-3101-advanced-string-formatting

    看来是要让字符串格式化的功能更加强大。

    从上面的链接: “在 Python 3.0 中,% 运算符由更强大的字符串格式化方法 format() 补充。对 str.format() 方法的支持已向后移植到 Python 2.6。”

    【讨论】:

    • 我的回答与 Jonathon Reinhart 关于进化和解决不足之处的评论一致,并得到 Python 文档的支持。那些投反对票的人如果能说出原因,那将有助于我进一步有意义地参与。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多