如何以惯用/功能的方式编写此代码?

时间:2017-04-20 22:30:17

标签: python functional-programming coding-style

我正在尝试以更模块化/可重用的方式编写这段python代码,而我却无法编写它

考虑一下:

lst = get_list_of_objects()

dic = {}
for item in lst:
    if item.attribute == 'foo':
        dic[item.name] = [func(x) for x in item.attribute2]
    elif item.attribute == 'bar':
        dic[item.name] = []
    else:
        dic[item.name] = [func2(x) for x in item.attribute3]

我尝试将其设为“功能性”:

fooItems = reduce(lambda dic, item: dic.update(item.name, map(func, item.attribute2)),
                  filter(lambda i: i.attribute == 'foo', lst),
                  {})
barItems = reduce(lambda dic, item: dic.update(item.name, []),
                  filter(lambda i: i.attribute == 'bar', lst),
                  fooItems)

dic = reduce(lambda dic, item: dic.update(item.name, map(func2, item.attribute3)),
             filter(lambda i: i.attribute != ('bar' or 'foo'), lst),
             barItems)

我真的不太喜欢这个解决方案。

  1. 它的可读性不如第一个。
  2. 它在列表上迭代3次而不是一次。
  3. 我想要的是一个分成3条路径的流,每条路径被映射,然后它们合并回同一个流并变成一个字典(我希望这句话有意义)

    请分享您对此的看法......

1 个答案:

答案 0 :(得分:0)

你可以拥有一个只选择值进入字典的函数,而不是修改字典:

def value(item):
    if item.attribute == 'foo':
        return [func(x) for x in item.attribute2]
    elif item.attribute == 'bar':
        return []
    else:
        return [func2(x) for x in item.attribute3]

然后你可以声明性地创建字典:

items = get_items()

dic = {item.name: value(item)
       for item in items}