将参数传输到组合函数的最内层调用

时间:2019-06-03 16:39:15

标签: python functional-programming

我正在构建数据流水线工具,希望能够一起编译一系列功能。

所有函数作用于可迭代对象,并将可迭代对象作为产生的值传递。

因此,如果f(x)过滤器和g(x)进行了编辑,并且h(x)生成了一个随机值,那么我希望能够将它们组合起来,因此可以调用{{1} }或f(g(h(x)))根据要求。

在知道h(f(g(x)))是什么之前,我希望能够准备这些合成(它们的参数签名超出了初始的可迭代性)。

为了使事情复杂化,xfg在共享它们消耗和发出的可迭代参数的同时,具有不同的参数签名。

为了方便起见,我可以将这些参数包装在h语句中以隐藏杂乱的参数-但接下来,我想按照partial示例组成一系列函数-这个想法是我想在运行时对特定的f(g(h(x)))进行迭代。

我发现对x进行了功能处理,随后嵌套它们意味着我无法访问该最深的参数-并且遇到诸如partial之类的错误。

换句话说,有没有一种方法可以让您推迟在运行时指定最内层函数所需的参数来链接或嵌套函数?

例如以下工作正常:

AttributeError: 'generator' object has no attribute 'keywords'

哪个输出:

OrderedDict([('id', '1'), ('name', 'Tom'), ('sync', 'a')])
OrderedDict([('id', 57), ('name', 'Steve'), ('sync', 'a')])
OrderedDict([('id', '3'), ('name', 'Ulrich'), ('sync', 'b')])
OrderedDict([('id', '4'), ('name', 'Victor'), ('sync', 'b')])
OrderedDict([('id', 33), ('name', 'Wolfgang'), ('sync', 'c')])
OrderedDict([('id', '6'), ('name', 'Xavier'), ('sync', 'c')])
OrderedDict([('id', 83), ('name', 'Yeti'), ('sync', 'c')])
OrderedDict([('id', '8'), ('name', 'Zaphod'), ('sync', 'd')])
test
OrderedDict([('id', '9'), ('name', 'Albert'), ('sync', 'd')])

但是我希望能够尽早编写该函数-稍后绑定所组合函数的迭代器。

类似的东西:

data_source = [ OrderedDict({"id" : "1", "name" : "Tom", "sync" : "a"}),
            OrderedDict({"id" : "2", "name" : "Steve", "sync" : "a"}),
            OrderedDict({"id" : "3", "name" : "Ulrich", "sync" : "b"}),
            OrderedDict({"id" : "4", "name" : "Victor", "sync" : "b"}),
            OrderedDict({"id" : "5", "name" : "Wolfgang", "sync" : "c"}),
            OrderedDict({"id" : "6", "name" : "Xavier", "sync" : "c"}),
            OrderedDict({"id" : "7", "name" : "Yves", "sync" : "c"}),
            OrderedDict({"id" : "8", "name" : "Zaphod", "sync" : "d"}),
           OrderedDict({"id" : "9", "name" : "Albert", "sync" : "d"})]


def f(x, filt):
    for content in x:
        if content['name']==filt:
            print ("test")
        yield content

def g(x,old, new):
    for content in x:
        if content["name"]==old:
            content["name"]=new
        yield content

def h(x, which):
    for content in x:
        if random.random()>0.5:
            content[which]=random.randint(0,100)
        yield content



p_f = partial(f, filt="Albert")
p_g = partial(g, old="Yves", new="Yeti")
p_h = partial(h, which='id')
iterator=(d for d in data_source)
for result in p_f(p_g(p_h(iterator))):
    print (result)

但是当我这样做时,我得到p_compiled = p_f(p_g(p_h)) for result in p_compiled(iterator): print (result)

1 个答案:

答案 0 :(得分:2)

听起来您只需要一个compose()函数:

def compose(f, g):
    return lambda x: f(g(x))

p_compiled = compose(p_f, compose(p_g, p_h))
for result in p_compiled(iterator):
    print (result)