不同版本Python中的文本格式化
我在不同的环境中执行Python脚本时遇到了问题,因为不同版本的解释器处理文本格式的方式不一样。
在Python 2.6之前,格式化文本是这样做的:
n = 3
print "%s * %s = %s" % (n, n, n*n)
而在Python 2.6及之后的版本中,最好的做法是:
n = 3
print "{0} * {0} = {1}".format(n, n*n)
但是,如果你想让这个脚本在任何Python版本中都能运行呢?是写Python 2.6之前的代码来确保兼容性更好,还是使用Python 2.6及之后的代码,这样在未来也能使用呢?
有没有其他方法可以编写代码,既能适应当前的Python版本,又不失去对旧版本的兼容性呢?
谢谢
3 个回答
你可以看看 string.Template (3.1版本的链接) 这种格式化字符串的方法,这个接口在所有2.5及以上的版本中都是稳定的。我觉得用拼接字符串是一个简单的方法,可以在旧版和新版的Python中都能用。虽然这种方法明显比较慢、代码比较长,而且没有其他方法那么符合Python的风格。
那老掉牙的元组或者字符串拼接呢?
print n, "*", n, "=", n*n
#or
print str(n) + " * " + str(n) + " = " + str(n*n)
虽然没那么花哨,但在任何版本中都应该能用。
如果觉得写起来太啰嗦,或许可以试试自定义一个函数来简化一下:
def format(fmt, values, sep="%%"):
return "".join(str(j) for i in zip(fmt.split(sep), values) for j in i)
#usage
format("%% * %% = %%", [n, n, n*n])
str.format() 是在 Python 2.6 版本中引入的,但在 Python 3.0 中,它才成为了字符串格式化的首选方法。
当然,在 Python 2.6 中,之前的格式化方法仍然可以使用。
这主要取决于使用你代码的人。如果你预计大多数用户不会使用 Python 3.0,那就继续使用旧的格式化方法。
不过,如果你的项目需要 Python 3.0 中某个必不可少的功能,那么要求用户使用特定版本的解释器也是可以理解的。不过要注意,Python 3.0 可能会让一些在 3.0 之前的代码无法运行。
总的来说,如果你的目标是 Python 3.0,就使用 str.format()。如果你的目标是 Python 3.0 之前的版本,就使用 % 格式化。