小编典典

字符串格式:% vs. .format vs. f-string 文字

all

Python 2.6
引入了该str.format()方法,其语法与现有%运算符略有不同。哪个更好,在什么情况下?

Python 3.6 现在通过语法f"my string". 此格式选项是否比其他格式更好?

  1. 下面使用每种方法,结果都一样,那么有什么区别呢?

     #!/usr/bin/python
    

    sub1 = “python string!”
    sub2 = “an arg”

    sub_a = “i am a %s” % sub1
    sub_b = “i am a {0}”.format(sub1)
    sub_c = f”i am a {sub1}”

    arg_a = “with %(kwarg)s!” % {‘kwarg’:sub2}
    arg_b = “with {kwarg}!”.format(kwarg=sub2)
    arg_c = f”with {sub2}!”

    print(sub_a) # “i am a python string!”
    print(sub_b) # “i am a python string!”
    print(sub_c) # “i am a python string!”

    print(arg_a) # “with an arg!”
    print(arg_b) # “with an arg!”
    print(arg_c) # “with an arg!”

  2. 此外,字符串格式化何时出现在 Python 中?例如,如果我的日志记录级别设置为 HIGH,我仍然会因为执行以下%操作而受到打击吗?如果是这样,有没有办法避免这种情况?

     log.debug("some debug info: %s" % some_info)
    

阅读 182

收藏
2022-02-25

共1个答案

小编典典

要回答您的第一个问题…….format在许多方面似乎更加复杂。一个令人讨厌的事情%是它如何接受一个变量或一个元组。你会认为以下方法总是有效的:

"hi there %s" % name

然而,如果name碰巧是(1, 2, 3),它会抛出一个TypeError. 为了保证它总是打印,你需要做

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

这很丑陋。.format没有这些问题。同样在你给出的第二个例子中,这个.format例子看起来更干净。

你为什么不使用它?

  • 不知道(在阅读本文之前我)
  • 必须与 Python 2.5 兼容

要回答您的第二个问题,字符串格式化与任何其他操作同时发生 - 在评估字符串格式化表达式时。并且 Python
不是一种惰性语言,它在调用函数之前评估表达式,因此在您的log.debug示例中,表达式"some debug info: %s"%some_info将首先评估为,例如"some debug info: roflcopters are active",然后该字符串将传递给log.debug()

2022-02-25