python“.format”函数

时间:2012-04-15 07:51:41

标签: python string dictionary formatting

最近,我发现''.format函数非常有用,因为与%格式相比,它可以提高可读性。 试图实现简单的字符串格式化:

data = {'year':2012, 'month':'april', 'location': 'q2dm1'}

year = 2012
month = 'april'
location = 'q2dm1'
a = "year: {year}, month: {month}, location: {location}"
print a.format(data)
print a.format(year=year, month=month, location=location)
print a.format(year, month, location)

虽然两个第一次打印的格式符合我的预期(是的,something=something看起来很难看,但这只是一个例子),最后一个会提升KeyError: 'year'。 在python中是否有任何技巧可以创建字典,因此它会自动填充键和值,例如somefunc(year, month, location)将输出{'year':year, 'month': month, 'location': location}

我是python的新手,无法找到有关此主题的任何信息,但是这样的技巧会大大改善和缩小我当前的代码。

提前致谢并原谅我的英语。

5 个答案:

答案 0 :(得分:6)

第一个print应为

print a.format(**data)

另外,如果你找到一些快捷方式,你可以写一个类似的,没有太大的区别。

def trans(year, month, location):
    return dict(year=year, month=month, location=location)

答案 1 :(得分:3)

data = {'year':2012, 'month':'april', 'location': 'q2dm1'}
a = "year: {year}, month: {month}, location: {location}"

print a.format(**data)

..正是你要找的。它在功能上与执行.format(year=data['year'], ...)或您提供的其他示例完全相同。

双星号的东西很难搜索,所以它通常被称为“kwargs”。这是一个good SO question on this syntax

答案 2 :(得分:1)

您可以使用dict() callable:

dict(year=yeah, month=month, location=location)

传递关键字参数时,会创建一个包含您指定为kwargs的元素的dict。

如果您不想指定参数名称,请使用.format()的位置样式:

>>> a = 'year {0} month {1} location {2}'
>>> print a.format(2012, 'april', 'abcd')
year 2012 month april location abcd

但是,如果您尝试执行类似于compact() in PHP的操作(创建一个dict将变量名称映射到其值而不单独指定名称和变量),请不要这样做。它只会导致丑陋的不可读代码,无论如何都需要讨厌的黑客攻击。

答案 3 :(得分:1)

您可以传递locals()

a.format(**locals())

当然,这有问题:您必须传递本地的所有内容,并且很难理解重命名或删除变量的效果。

更好的方法是:

a.format(**{k:v for k,v in locals() if k in ('year', 'month')})
# or; note that if you move the lambda expression elsewhere, you will get a different result
a.format(**(lambda ld = locals(): {k:ld[k] for k in ('year', 'month')})())

但这不是更简洁,除非你用一个函数包装它(当然必须带一个dict参数)。

答案 4 :(得分:0)

Python 3.6开始,您还可以使用新的Formatted string literals (f-strings),您可以将其用于变量

year = 2012
month = 'april'
location = 'q2dm1'
a = f"year: {year}, month: {month}, location: {location}"
print(a)

词典

data = {'year': 2012, 'month': 'april', 'location': 'q2dm1'}
a = f"year: {data['year']}, month: {data['month']}, location: {data['location']}"
print(a)

请注意字符串文字前面的f前缀。

  

PEP 498: Formatted string literals

     

格式化的字符串文字以' f'为前缀。和类似的   格式字符串由str.format()接受。它们包含替代品   被花括号包围的字段。替换字段是   表达式,在运行时计算,然后使用格式化   format()协议:

>>>
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # nested fields
'result:      12.35'
     

...