【问题标题】:reduce list of functions with keyword argument on dictionary in python减少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"]}
  • 是的,我就是这样 - 我也试过了,我很快就会在这里发布。

标签: python dictionary lambda functional-programming reduce


【解决方案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"]

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2021-03-03
    • 2014-05-16
    • 2011-03-09
    • 2021-12-06
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多