首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python格式化字符串和命名参数

用Python格式化字符串和命名参数
EN

Stack Overflow用户
提问于 2013-07-27 08:29:40
回答 2查看 92.7K关注 0票数 80

案例1:

代码语言:javascript
复制
"{arg1} {arg2}".format(10, 20)

它将给出KeyError: 'arg1',因为我没有传递命名的参数。

案例2:

代码语言:javascript
复制
"{arg1} {arg2}".format(arg1=10, arg2=20)

现在它将正常工作,因为我传递了命名的参数。然后打印'10 20'

案例3:

而且,如果我传递了错误的名称,它将显示KeyError: 'arg1'

代码语言:javascript
复制
"{arg1} {arg2}".format(wrong=10, arg2=20)

但,

案例4:

如果我以的方式传递命名的参数,那么是错误的

代码语言:javascript
复制
"{arg1} {arg2}".format(arg2=10, arg1=20)

起作用了..。

然后打印'20 10'

我的问题是,为什么它会工作,在本例中,命名参数的用途是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-27 08:30:50

命名替换字段( {...}部件在格式字符串中)与.format()方法的关键字参数匹配,而不是位置参数。

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

如果要与位置参数匹配,请使用数字:

代码语言:javascript
复制
"{0} {1}".format(10, 20)

在Python2.7和更高版本中,您可以省略数字;然后,{}替换字段按照格式字符串中的外观顺序自动编号:

代码语言:javascript
复制
"{} {}".format(10, 20) 

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

代码语言:javascript
复制
"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam')

引用格式字符串规范的话

field_name本身以一个arg_name开头,它要么是,要么是数字,要么是关键字。如果它是一个数字,它引用一个位置参数,如果它是一个关键字,它引用一个命名的关键字参数。

强调我的。

如果您要创建一个大型格式化字符串,那么使用命名替换字段通常更容易阅读和维护,因此您不必一直计算参数,并弄清楚结果字符串中的参数是什么。

您还可以使用**keywords调用语法将现有的字典应用于一种格式,从而很容易将CSV文件转换为格式化的输出:

代码语言:javascript
复制
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应用于格式化字符串时,更容易看到发生了什么。

票数 131
EN

Stack Overflow用户

发布于 2019-09-12 08:02:46

额外的好处包括

  • 不必担心参数的顺序,。它们将落入字符串中的正确位置,就像格式化程序中的名称所指示的那样。
  • 您可以将相同的参数放在一个字符串中两次中,而不必重复该参数。例如,"{foo} {foo}".format(foo="bar")给出了“酒吧”

请注意,您也可以提供额外的参数而不会导致错误。所有这些都特别有用

  • 稍后用较少的更改更改字符串格式化程序,从而减少错误的可能性,。如果它不包含新的命名参数,那么format函数将仍然工作,而不需要更改参数,并将参数放在格式化程序中指示它们的位置。
  • 您可以让多个格式化程序字符串共享一组参数。例如,在这种情况下,您可以拥有一个包含所有参数的字典,然后根据需要在格式化程序中选择它们。

例如:

代码语言:javascript
复制
>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))
代码语言:javascript
复制
I need foo (bar) and dead (beef)
I need test (case) and foo (bar) and then test again (case)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17895835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档