跳到内容

printf 字符串格式化 (UP031)

源自 pyupgrade linter。

有时提供修复。

作用

检查 printf 样式的字符串格式化,并提供将其替换为 str.format 调用的方法。

为什么这不好?

printf 样式的字符串格式化有很多怪癖,并且比使用 str.format 调用或 f 字符串导致更少的代码可读性。通常,优先使用较新的 str.format 和 f 字符串结构,而不是 printf 样式的字符串格式化。

示例

"%s, %s" % ("Hello", "World")  # "Hello, World"

建议改为

"{}, {}".format("Hello", "World")  # "Hello, World"
f"{'Hello'}, {'World'}"  # "Hello, World"

修复安全性

在格式字符串包含单个通用格式说明符(例如 %s),并且右侧是一个模糊表达式的情况下,我们无法提供安全的修复。

例如,给定

"%s" % val

val 可以是单元素元组,单个值(不包含在元组中)。当使用 printf 样式格式化时,两者都将解析为相同的格式化字符串,但在使用 f 字符串时解析方式不同

val = 1
print("%s" % val)  # "1"
print("{}".format(val))  # "1"

val = (1,)
print("%s" % val)  # "1"
print("{}".format(val))  # "(1,)"

参考