最近,我发现''.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的新手,无法找到有关此主题的任何信息,但是这样的技巧会大大改善和缩小我当前的代码。
提前致谢并原谅我的英语。
答案 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'
...