在Python中格式化string和命名参数

情况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'

我的问题是为什么它起作用,在这种情况下命名参数有什么用处。

命名的replace字段( 格式string中的{...}部分与.format()方法的关键字参数匹配,而不是位置参数

关键字参数就像字典中的键; 顺序无关紧要,因为它们与名称匹配。

如果你想匹配位置参数,使用数字:

 "{0} {1}".format(10, 20) 

在Python 2.7及更高版本中,您可以省略数字; 然后按照格式化string中的顺序自动编号replace字段:

 "{} {}".format(10, 20) 

格式化string可以与位置关键字参数匹配,并且可以多次使用参数:

 "{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam') 

引用格式string规范 :

field_name本身以一个数字或关键字arg_name开头。 如果是数字,则表示位置参数,如果是关键字,则表示一个已命名的关键字参数。

强调我的。

如果你正在创build一个大的格式化string,那么使用命名replace字段通常更具可读性和可维护性,所以你不必一直计算出参数,找出哪个参数放到结果string的哪里。

您还可以使用**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) 

在这里, picturelinkdescriptionprice都是row字典中的关键字,而且更容易看到将row应用于格式string时会发生什么情况。