将输出从一个对象映射到另一个对象的输入以延迟的方式

时间:2017-01-13 12:52:59

标签: python

我正在尝试在python中编写一个简单的工作流/管道对象,其中可以将许多函数链接在一起并以正确的顺序执行它们。所以,最终我得到一个图形,其中一个函数的输出被作为另一个函数的输入管道,我希望能够在函数之间映射这些变量。我认为我可以这样做的一种方式如下:

class Node1(object):
    def __init__(self):
        self.inputs = {}
        self.inputs['a'] = None
        self.inputs['b'] = None
        self.outputs = {}
        self.outputs['result'] = None

    def add_input(self, key, value):
        self.inputs[key] = value

    def run(self):
        self.outputs['result'] = 42

class Node2(object):
    def __init__(self):
        self.inputs = {}
        self.inputs['num1'] = None
        self.outputs = {}
        self.outputs['num2'] = None

    def add_input(self, key, value):
        self.inputs[key] = value

    def run(self):
        self.outputs['num2'] = self.inputs['num1'] * 5

现在可以做一些事情:

n1 = Node1()
n1.inputs['a'] = 5
n1.inputs['b'] = 15

n2 = Node2()
n2.inputs['num1'] = n1.outputs['num2']
n1.run()
n2.run()

现在,这种方法的问题是n1.outputs['num2']仅在run()对象上调用n1函数后计算。据我所知,我不能在python中使用引用,因此该代码在尝试多个None * 5时失败。修复是:

n1.run()
n2.inputs['num1'] = n1.outputs['num2']
n2.run()

然而,这很烦人,因为它使得specifying工作流非常困难,因为必须在运行工作流的一些位之后建立连接。

有人能为这个问题提出一个好的解决方案吗?在C ++中,我可以简单地使用引用,但我不确定在python中如何处理。

2 个答案:

答案 0 :(得分:1)

您不能存储指向简单值(整数,字符串)的链接,但可以将它们存储到容器(dict,list)。

所以你可以改变你的逻辑:

def connect_input(self, input_name, outputs, output_name):
    self.inputs[input_name] = [outputs, output_name]

您有以下方法:

run

但是您需要修改def run(self): outputs, key = self.inputs['num1'] self.outputs['num2'] = outputs[key] * 5 方法以使用以下格式:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-commons</artifactId>
    <version>1.12.2.RELEASE</version>
</dependency>

答案 1 :(得分:1)

  

我正在尝试在python中编写一个简单的工作流/管道对象,其中可以将许多函数链接在一起并以正确的顺序执行它们。

看看RxPy

Observable.just({'a': 5, 'b': 15}) \
    .map(lambda x: x['a'] + x['b']) \
    .map(lambda x: x * 5) \
    .subscribe(lambda x: print x)

有许多运营商可以描述相当复杂的流水线。