在 python 中减少字典中带有关键字参数的函数列表
reduce list of functions with keyword argument on dictionary in python
:)
我想在我的代码中构建一个非常小的功能管道,以减少单个字典上的一堆功能。每个函数做一件事,但在不同的键上,这是一个简化的例子:
我有这本词典
d = {"me": "gab", "you": "cita"}
假设有一个像这样的傻函数:
def make_caps(dic, on=None):
if on is not None:
to_cap = dic.get(on, None)
if to_cap is not None:
dic[on] = to_cap.upper()
return dic
我想让这个工作:
def reduce_fns_on_dict(fns, dic):
from functools import reduce
return reduce(lambda d, f: f(d), fns, dic)
new_dic = reduce_fns_on_dict(fns=[make_caps(on="me"), make_caps(on="you")],
dic=d)
print(new_dic)
在控制台上
{'me': 'GAB', 'you': 'CITA'}
但是当我 运行 以上时,我得到:
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: make_caps() missing 1 required positional argument: 'dic'
make_caps(on="me")
调用 make_caps 函数。您想要的是一个行为类似于 make_caps(some_arg, on='me')
的新函数。你可以用 functools.partial 来实现这样的功能。该行看起来像 fns=[partial(make_caps, on="me")...
.
编辑:或者,您可以 curry 函数。
为了完成@FiddleStix 的回答,我建议您使用字典理解,我认为它非常适合您的情况:
d = {"me": "gab", "you": "cita"}
new_dic = {k:v.upper() for k,v in d.items() if k in ["me","you"]}
print(new_dic)
# {'me': 'GAB', 'you': 'CITA'}
注意:如果要将字典的值全部大写,可以去掉if k in ["me","you"]
。
:)
我想在我的代码中构建一个非常小的功能管道,以减少单个字典上的一堆功能。每个函数做一件事,但在不同的键上,这是一个简化的例子:
我有这本词典
d = {"me": "gab", "you": "cita"}
假设有一个像这样的傻函数:
def make_caps(dic, on=None):
if on is not None:
to_cap = dic.get(on, None)
if to_cap is not None:
dic[on] = to_cap.upper()
return dic
我想让这个工作:
def reduce_fns_on_dict(fns, dic):
from functools import reduce
return reduce(lambda d, f: f(d), fns, dic)
new_dic = reduce_fns_on_dict(fns=[make_caps(on="me"), make_caps(on="you")],
dic=d)
print(new_dic)
在控制台上
{'me': 'GAB', 'you': 'CITA'}
但是当我 运行 以上时,我得到:
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: make_caps() missing 1 required positional argument: 'dic'
make_caps(on="me")
调用 make_caps 函数。您想要的是一个行为类似于 make_caps(some_arg, on='me')
的新函数。你可以用 functools.partial 来实现这样的功能。该行看起来像 fns=[partial(make_caps, on="me")...
.
编辑:或者,您可以 curry 函数。
为了完成@FiddleStix 的回答,我建议您使用字典理解,我认为它非常适合您的情况:
d = {"me": "gab", "you": "cita"}
new_dic = {k:v.upper() for k,v in d.items() if k in ["me","you"]}
print(new_dic)
# {'me': 'GAB', 'you': 'CITA'}
注意:如果要将字典的值全部大写,可以去掉if k in ["me","you"]
。