减少python中字典上带有关键字参数的函数列表
Posted
技术标签:
【中文标题】减少python中字典上带有关键字参数的函数列表【英文标题】:reduce list of functions with keyword argument on dictionary in python 【发布时间】:2020-05-07 11:55:54 【问题描述】::)
我想在我的代码中构建一个非常小的函数管道,以减少单个字典中的一堆函数。每个函数只做一件事,但在不同的键上,这里有一个简化的例子:
我有这本词典
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'
【问题讨论】:
使用字典理解来执行这种事情不是更具可读性吗?示例:new_dic = k:v.upper() for k,v in d.items() if k in ["me","you"]
是的,我就是这样 - 我也试过了,我很快就会在这里发布。
【参考方案1】:
make_caps(on="me")
调用 make_caps 函数。你想要的是一个行为类似于make_caps(some_arg, on='me')
的新函数。您可以使用functools.partial 来实现这样的功能。该行将类似于fns=[partial(make_caps, on="me")...
。
编辑:或者,您可以curry 函数。
【讨论】:
partial
!真的!非常感谢!【参考方案2】:
要完成@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"]
。
【讨论】:
以上是关于减少python中字典上带有关键字参数的函数列表的主要内容,如果未能解决你的问题,请参考以下文章