Python字符串格式化中连续大括号的作用及参数插入位置问询
Python格式化字符串问题解答
示例代码
width = int(input('Please enter width:')) price_width = 10 item_width = width - price_width header_fmt = "{{:{}}}{{:>{}}}".format(item_width, price_width) fmt = "{{:{}}}{{:{}.2f}}".format(item_width, price_width) print('=' * width) print(header_fmt.format('Item', 'Price')) print('-' * width) print(fmt.format('Apples', 0.4)) print(fmt.format('Pears', 0.5)) print(fmt.format('Cantaloupes', 1.92)) print(fmt.format('Dried Apricots(16 oz.)', 8)) print(fmt.format('Prunes(4 lbs.)', 12)) print('=' * width)
问题与解答
1. 语句'{{:{}}}{{:>{}}}'.format(item_width, price_width)中的大括号分别表示什么含义?
在Python字符串格式化规则里,连续的两对大括号{{}}会被转义成单个大括号{},用来作为后续二次格式化的占位符。拆分解析:
{{:{}}}:外层{{}}最终转为{:},内层的{}是当前format方法的第一个占位符,用来填充item_width;{{:>{}}}:外层{{}}最终转为{:>},内层的{}是当前format方法的第二个占位符,用来填充price_width。
执行完这次format后,整个字符串会变成类似{:X}{:>Y}的格式模板(X是item_width的数值,Y是price_width的数值),供后续表头格式化使用。
2. item_width和price_width最终被插入到什么位置?
item_width会填入第一个内层{}的位置,也就是{{:{}}}里的那个单大括号;price_width会填入第二个内层{}的位置,也就是{{:>{}}}里的那个单大括号。
举个实际例子:如果输入的总宽度width是30,那么item_width=20、price_width=10,执行第一次格式化后,header_fmt会变成{:20}{:>10}。
3. 在print(header_fmt.format('Item', 'Price'))中,已插入item_width和price_width后,Item和Price会被插入到哪里?
此时header_fmt已经是{:20}{:>10}这类格式模板:
Item会被插入到第一个占位符{:20}的位置,按照左对齐规则填充20个字符宽度;Price会被插入到第二个占位符{:>10}的位置,按照右对齐规则填充10个字符宽度。
最终表头会呈现出Item左占20位、Price右占10位的规整格式。
关于删除大括号触发TypeError的说明
如果随意删除一对大括号,比如改成'{:{}}{{:>{}}}'.format(item_width, price_width),会导致字符串中的占位符数量和format传入的参数数量不匹配,从而触发TypeError。原语句里的{{}}是转义专用的,必须成对出现才能生成后续二次格式化需要的单个占位符大括号,少一对就会破坏占位符与参数的对应关系。
内容的提问来源于stack exchange,提问作者jtindex
相关产品推荐
相关产品推荐

