案例1:
"{arg1} {arg2}".format (10, 20)
它会给KeyError: 'arg1'
,因为我没有传递命名参数。
案例2:
"{arg1} {arg2}".format(arg1 = 10, arg2 = 20)
现在它将正常工作,因为我传递了命名参数。
并打印'10 20'
案例3:
而且,如果我输错了名字,它会显示KeyError: 'arg1'
"{arg1} {arg2}".format(wrong = 10, arg2 = 20)
但是,
案例4:
如果我以错误顺序
传递命名参数"{arg1} {arg2}".format(arg2 = 10, arg1 = 20)
它有效......
并打印'20 10'
我的问题是它的工作原理以及在这种情况下使用命名参数的原因。
答案 0 :(得分:103)
命名替换字段(format string中的{...}
部分)与关键字参数匹配到.format()
方法,而不是位置参数< / em>的
关键字参数就像字典中的键;顺序无关紧要,因为它们与名称匹配。
如果您想与位置参数匹配,请使用数字:
"{0} {1}".format(10, 20)
在Python 2.7及更高版本中,您可以省略数字;然后,{}
替换字段按照格式化字符串中的外观顺序自动编号:
"{} {}".format(10, 20)
格式化字符串可以与位置和关键字参数匹配,并且可以多次使用参数:
"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam')
引用format string specification:
field_name 本身以 arg_name 开头,数字或关键字。如果它是一个数字,它引用一个位置参数,如果它是一个关键字,它引用一个命名关键字参数。
强调我的。
如果要创建一个大型格式化字符串,使用命名替换字段通常更易读和可维护,因此您不必继续计算参数,并找出哪个参数在结果字符串中的位置。
您还可以使用**keywords
调用语法将现有字典应用于格式,从而可以轻松将CSV文件转换为格式化输出:
import csv
fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans')
table_row = '''\
<tr>
<td><img src="{picture}"></td>
<td><a href="{link}">{description}</a> ({price:.2f})</td>
</tr>
'''
with open(filename, 'rb') as infile:
reader = csv.DictReader(infile, fieldnames=fields, delimiter='\t')
for row in reader:
row['price'] = float(row['price']) # needed to make `.2f` formatting work
print table_row.format(**row)
此处,picture
,link
,description
和price
都是row
词典中的所有键,而且更容易查看将row
应用于格式化字符串时会发生什么。
答案 1 :(得分:2)
其他好处包括
"{foo} {foo}".format(foo="bar")
赋予“ bar bar” 请注意,您也可以提供其他参数而不会引起错误。 当
例如:
>d = {"foo":"bar", "test":"case", "dead":"beef"}
>print("I need foo ({foo}) and dead ({dead})".format(**d))
>print("I need test ({test}) and foo ({foo}) and then test again ({test})".format(**d))
I need foo (bar) and dead (beef)
I need test (case) and foo (bar) and then test again (case)