Python 2.6引入的str.format()方法与现有%运算符的语法略有不同。哪个更好,什么情况下适合?
str.format()
以下使用每种方法并具有相同的结果,那么有什么区别?
#!/usr/bin/python sub1 = "python string!" sub2 = "an arg" a = "i am a %s" % sub1 b = "i am a {0}".format(sub1) c = "with %(kwarg)s!" % {'kwarg':sub2} d = "with {kwarg}!".format(kwarg=sub2) print a # "i am a python string!" print b # "i am a python string!" print c # "with an arg!" print d # "with an arg!"
此外,何时在Python中进行字符串格式化?例如,如果我的日志记录级别设置为HIGH,那么执行以下%操作是否还会对我有所帮助?如果是这样,有办法避免这种情况吗?
HIGH
%
log.debug("some debug info: %s" % some_info)
第一个问题... .format在许多方面似乎都更加复杂。一个令人烦恼的事情%是它如何可以接受变量或元组。你会认为以下各项将始终有效:
... .format
"hi there %s" % name
但是,如果name碰巧(1, 2, 3),它将抛出一个TypeError。为了确保它始终打印,你需要执行
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"