5

最近,我发现''.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看起来很丑,但这只是一个例子),最后一个会 raise KeyError: 'year'. python中是否有任何技巧来创建字典,以便它会自动填充键和值,例如somefunc(year, month, location)输出{'year':year, 'month': month, 'location': location}

我对 python 很陌生,找不到关于这个主题的任何信息,但是这样的技巧会大大改善和缩小我当前的代码。

在此先感谢并原谅我的英语。

4

5 回答 5

6

第一个print应该是

print a.format(**data)

此外,如果你正在寻找一些捷径,你可以写一个类似的,没有太大的区别。

def trans(year, month, location):
    return dict(year=year, month=month, location=location)
于 2012-04-15T08:01:34.597 回答
3
data = {'year':2012, 'month':'april', 'location': 'q2dm1'}
a = "year: {year}, month: {month}, location: {location}"

print a.format(**data)

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

double-asterix 是一个很难搜索的东西,所以它通常被称为“kwargs”。这是关于此语法的一个很好的 SO 问题

于 2012-04-15T13:03:28.557 回答
1

您可以使用dict()可调用的:

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()PHP中所做的事情(创建一个将变量名称映射到其值的字典,而不单独指定名称和变量),请不要这样做。它只会导致丑陋的不可读代码,并且无论如何都需要讨厌的黑客攻击。

于 2012-04-15T07:53:03.093 回答
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 参数)。

于 2012-04-15T09:54:41.617 回答
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:格式化字符串文字

格式化字符串文字以'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'

...

于 2017-01-29T17:29:12.587 回答