将多个字典解压缩为函数参数,不重复双星号



我使用具有长参数名称的API。因此,我为最常见的值组合创建了以下字典,然后在函数调用中解包。

a_T = {'API parameter a': True}
a_F = {'API parameter a': False} 
b_100 = {'API parameter b': 100}
b_0 = {'API parameter b': 0}
hello = {'API parameter c': 'hello'}
bye = {'API parameter d': 'goodbye'}    
myf(**a_T, **bye)
myf(**b_0)
myf(**a_F, **b_100, **hello, **bye)

有没有办法避免重复的双星号?由于这些奇怪的字符,代码变得非常难以读懂。

一旦可以添加这个解包工具到myf:

myf(a_T, bye)
myf(b_0)
myf(a_F, b_100, hello, bye)

您可以在Python 3.9+中使用|来组合所有字典,然后发送未打包的版本。

def fun(**kwargs):
print(kwargs)
>>> fun(**a_F| b_100| hello| bye)
{'API parameter a': False, 'API parameter b': 100, 'API parameter c': 'hello', 'API parameter d': 'goodbye'}

或者只使用*args并传递多个字典:

def fun(*args):
print(args)

>>> fun(a_F,b_100,hello,bye)
({'API parameter a': False}, {'API parameter b': 100}, {'API parameter c': 'hello'}, {'API parameter d': 'goodbye'})

另一个解决方案是使用Python的decorator并处理decorator函数内部的丑陋部分:

def decorator(fun):
def wrapper(*args):
from functools import reduce
kwargs = reduce(lambda a, b: a | b, args)
return fun(**kwargs)
return wrapper
@decorator
def main_fun(**kwargs):
print(kwargs)

>>> main_fun(a_F,b_100,hello,z)
{'API parameter a': False, 'API parameter b': 100, 'API parameter c': 'hello', 'parameter 4': 'goodbye'}

要解压缩一系列字典,请使用dict.update或嵌套推导式:

def myf(*dicts):
merged = {k: v for d in dicts for k, v in d.items()}
# do stuff to merged

def myf(*dicts):
merged = {}
for d in dicts:
merged.update(d)

最新更新