在 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"]