我正在尝试在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中如何处理。
答案 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)
有许多运营商可以描述相当复杂的流水线。