Python 2.6 引入了该str.format()方法,其语法与现有%运算符略有不同。哪个更好,在什么情况下?
str.format()
%
Python 3.6 现在通过语法f"my string". 此格式选项是否比其他格式更好?
f"my string"
下面使用每种方法,结果都一样,那么有什么区别呢?
#!/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!”
此外,字符串格式化何时出现在 Python 中?例如,如果我的日志记录级别设置为 HIGH,我仍然会因为执行以下%操作而受到打击吗?如果是这样,有没有办法避免这种情况?
log.debug("some debug info: %s" % some_info)
要回答您的第一个问题…….format在许多方面似乎更加复杂。一个令人讨厌的事情%是它如何接受一个变量或一个元组。你会认为以下方法总是有效的:
.format
"hi there %s" % name
然而,如果name碰巧是(1, 2, 3),它会抛出一个TypeError. 为了保证它总是打印,你需要做
name
(1, 2, 3)
TypeError
"hi there %s" % (name,) # supply the single argument as a single-item tuple
这很丑陋。.format没有这些问题。同样在你给出的第二个例子中,这个.format例子看起来更干净。
你为什么不使用它?
要回答您的第二个问题,字符串格式化与任何其他操作同时发生 - 在评估字符串格式化表达式时。并且 Python 不是一种惰性语言,它在调用函数之前评估表达式,因此在您的log.debug示例中,表达式"some debug info: %s"%some_info将首先评估为,例如"some debug info: roflcopters are active",然后该字符串将传递给log.debug()。
log.debug
"some debug info: %s"%some_info
"some debug info: roflcopters are active"
log.debug()