在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)
在这里, picture
, link
, description
和price
都是row
字典中的关键字,而且更容易看到将row
应用于格式string时会发生什么情况。