2017-01-13 8 views
0

私は、多くの関数をまとめて正しい順序で実行できる、単純なワークフロー/パイプラインオブジェクトを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 

は今、1のような何かを行うことができます。今すぐ

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を複数試行するので失敗します。修正は次のとおりです。接続がワークフローのビットが実行された後に行わなければならないとして、それはspecifyingワークフローは非常に困難にして

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

しかし、これは迷惑です。

誰でもこの問題の良い解決策を提案できますか? C++では、単純に参照を使うことができましたが、この場合Pythonで何をすべきかわかりません。

答えて

1

単純な値(整数、文字列)へのリンクは保存できませんが、コンテナ(dict、list)に格納できます。

だから、あなたがあるためにあなたのロジックを変更することができます:

次のメソッドを持っている
n1 = Node1() 
n2 = Node1() 
n2.connect_input('num1', n1.outputs, 'num2') 

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 
+0

私は基本的にシャワーでこれも考えていました。基本的には、コンテナも渡してください! – Luca

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) 

非常に複雑なパイプラインを記述できる演算子が多数あります。

+0

これは興味深いです。結局、私はただ一つの図書館に行くかもしれない。 – Luca

関連する問題