减少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中字典上带有关键字参数的函数列表的主要内容,如果未能解决你的问题,请参考以下文章

Python基础语法

python函数

python函数

如何将字典传递给带有关键字参数的函数?

递归遍历带有列表的嵌套字典,并替换匹配的值

369列表/字典的分拆, unpacking