python中的反转函数组合(不仅仅是)

时间:2017-04-10 12:43:00

标签: python functional-programming composition

让我们说我们有很多这样的函数:

def init(value):
    return {'number': value}


def set_type(value):
    if isinstance(value['number'],  float):
        value['type'] = 'float'
    else:
        value['type'] = 'integer'
    return value


def set_is_positive(value):
    if value['number'] < 0:
        value['is_positive'] = False
    else:
        value['is_positive'] = True
    return value

并撰写如下函数:

def compose(*funcs):
    def compose_2_funcs(f1, f2):
        return lambda arg: f1(f2(arg))

    return reduce(compose_2_funcs, funcs)

每个函数的结果都作为下一个参数传递。例如,composed = compose(f, g, h); result = composed(arg)result = f(g(h(arg)))相同。这允许我们:

description_builder = compose(set_type, set_is_positive, init)
description_builder(5)
# Result: {'number': 5, 'type': 'integer', 'is_positive': True}

这很好,很灵活,我喜欢用它。但有一件事困扰着我。它看起来有点反直觉,功能按相反的顺序指定(特别是那些不知道什么是“功能组合”的人)

所以我可以定义一个这样的函数:

def compose_reversed(*funcs):
    def composed(arg):
        result = arg
        for f in funcs:
            result = f(result)
        return result

    return composed

它更具可读性(恕我直言),并允许在调用函数时指定函数,因此description_builder = compose_reversed(init, set_is_positive, set_type)

最后,这是我的问题:)

  1. 这件事有什么特别的名字吗?评论中提出:pipecompose_right(以及compose_left)。
  2. 与经典功能组合相比有哪些优点和缺点?
  3. P.S。我相信这个问题适用于任何具有高阶函数的语言,而不仅仅是python。

1 个答案:

答案 0 :(得分:0)

所以,似乎我们对此没有更多的意见。

总结一下:

  1. 提议的名称为pipecompose_right(以及compose_left
  2. 这里不多。这看起来像个人品味和特殊情况。 compose_left更像是数学中的函数组合,而compose_right可能被认为更具可读性,因为函数的列出顺序与应用的顺序相同。
  3. 将此标记为答案,直到有人想要更详细。