在Python的字符串格式化场景中,花括号通常是占位符的标识,比如使用format方法或者f-string时,花括号用于标记需要替换的变量位置。如果需要在最终输出中保留字面量的花括号,就需要遵循特定的转义规则,否则会触发格式化异常或者得到错误的输出结果。

使用format方法输出字面量花括号
format方法是最常用的字符串格式化方式之一,它的转义规则是:如果需要输出一个字面量的左花括号{,就连续写两个左花括号{{;如果需要输出一个字面量的右花括号},就连续写两个右花括号}}。格式化时会自动将两个连续的花括号转义为一个字面量花括号。
来看一个基础示例,我们需要输出文本用户{张三}的积分是100,其中花括号是字面量:
# 使用format方法输出字面量花括号
text = "用户{{张三}}的积分是{}".format(100)
print(text)
# 输出结果:用户{张三}的积分是100
如果同时需要输出多个字面量花括号,同样遵循双写规则:
# 多个字面量花括号的场景
template = "配置项:{{key: {0}, value: {1}}}".format("name", "test")
print(template)
# 输出结果:配置项:{key: name, value: test}
使用f-string输出字面量花括号
f-string是Python3.6及以上版本引入的格式化方式,语法更简洁,它的字面量花括号转义规则和format方法一致,也是双写花括号实现转义。需要注意的是,f-string中花括号内部是表达式,双写规则只作用于需要作为字面量输出的花括号,表达式内的花括号不需要双写。
示例:输出当前时间:{2024-05-20},其中花括号是字面量,内部是固定文本:
# f-string输出字面量花括号
date_str = "2024-05-20"
text = f"当前时间:{{ {date_str} }}"
print(text)
# 输出结果:当前时间:{ 2024-05-20 }
如果f-string中同时有表达式占位符和字面量花括号,要区分开:
name = "李四"
score = 95
# 表达式{score}是占位符,{{}}是字面量花括号
text = f"学生{{ {name} }}的分数是{score}"
print(text)
# 输出结果:学生{ 李四 }的分数是95
使用%格式化输出字面量花括号
%格式化是Python早期的字符串格式化方式,这种方式下花括号本身没有特殊含义,不需要转义,直接写花括号就可以作为字面量输出。因为%格式化的占位符是%s、%d这类形式,花括号不会被识别为占位符。
示例:
# %格式化输出字面量花括号
text = "集合元素:{%s, %s}" % ("apple", "banana")
print(text)
# 输出结果:集合元素:{apple, banana}
三种方式对比
我们可以通过表格清晰对比三种格式化方式的字面量花括号处理规则:
| 格式化方式 | 字面量左花括号写法 | 字面量右花括号写法 | 是否需要转义 |
|---|---|---|---|
| format方法 | {{ | }} | 是,双写转义 |
| f-string | {{ | }} | 是,双写转义 |
| %格式化 | { | } | 否,直接书写 |
常见错误场景
很多开发者会犯的错误是,在format或者f-string中只写单个花括号想输出字面量,比如下面的代码:
# 错误示例:单个花括号会被识别为占位符
try:
text = "用户{张三}的积分是{}".format(100)
print(text)
except Exception as e:
print(f"报错信息:{e}")
# 输出报错:IndexError: Replacement index 0 out of range for positional args tuple
这是因为单个花括号被识别为需要替换的占位符,但是里面没有对应的索引或者变量名,所以会触发异常。正确的写法就是双写花括号。
注意事项
- 只有在format方法和f-string中才需要对花括号转义,%格式化不需要,不要混淆规则。
- 双写花括号时,不要额外添加空格,比如
{{是错误的,必须是连续的{{。 - 如果需要在字面量花括号内部嵌套表达式,要注意区分转义规则和表达式语法,避免语法错误。