2012-04-12 14 views
4

私は間に構造化データを渡すノードのネットワークを持っています。私の部分問題のために、私たちはこの枝を持っている - ノードの直鎖配列:イテレータの作成方法は?

nodes = [source, n1, n2, n3, n4] 

最初のノードが互いにノードは、入力ノードから値を取得し、出力値を提供し、発電機です。現在の実装は、パイプからget()を普通に行い、パイプにput()を行い、ノードごとに別々のスレッドがあります(それには理由があります)。私はそれをyieldイテレータに変更したいと思います。

そして、私は(私たちは、ノードが呼び出し可能であることを考慮すれば)次のように評価したい:

for result in n4(n3(n2(n1(source()))): 
    print result 

私はこのような評価コンテキストの建設を想像:

context = src 
for node in nodes[1:]: 
    context = pipe(context, node) 

for result in context: 
    print result 

制限事項:

私はまだノードを別々に使用できるようにしたい - ネストされていない、他の手段でデータをパイプすること。ノード別のスレッドに存在する可能性があります。例:とn3の間でパイプされたデータ(入れ子にされている可能性があります)内のあるスレッド(ネストされている可能性があります)に[source, n1,n2]、もう1つ(入れ子になっているかもしれません)に[n3, n4]。ケース:分岐をこのようにグループ化したい非線形のノードグラフがあるかもしれません。

nodecontextpipe(context, node)の実装は次のようになりますどのように計算状態に

を保持するクラスである必要がありますか?それとも別の方法で解決できるかどうか、ヒントはありますか?

yield from Python 3.3 (PEP380)私のケースを助けることができますか?

答えて

2

任意の数の関数(または呼び出し可能コード)を作成する場合は、functionalモジュールのマニュアルのcompose_mult recipeを使用してください。

ことを使用液:

from functional import compose, foldr, partial 
from itertools import imap 
compose_mult = partial(reduce, compose) 
chain_nodes = lambda nodes: imap(compose_mult(nodes[1:]), nodes[0]) 
chain_gen_nodes = lambda nodes: imap(compose_mult((g.send for g in nodes[1:])), nodes[0]) 


# equivalent not as a one-liner 
#def chain_nodes(nodes): 
# source = nodes[0] 
# composed_nodes = compose_mult(nodes[1:]) 
# return (composed_nodes(x) for x in source) 

をノード(sendを介して)入力を受け入れる発生している場合、それらの送信機能を抽出する、chain_gen_nodesを使用します。

ただし、値を受け取るにはyieldの時点にある必要があるため、ちょうど開始された発電機にはsendは許可されません。これは、自分のジェネレータyieldを最初の反復でダミー値にし、ある時点でそれらを進めてchain_nodesに送るなど、自分で処理する必要があるものです。あるいは、ノードを通常の呼び出し可能なものとして保つこともできます。

あなたはイテレータ一歩前進させるために必要がある場合:next(izip(*nodes[1:]))

+0

私は私の質問に書いたものである - 私が達成したい原則です。問題は、計算の前にノードのリストがわからないということです。そのため、私はノードを配列 'nodes = [...]'として列挙しています。 – Stiivi

+1

@Stiiviあなたが書いたことではありません。しかし、私は自分の答えを更新しました。 – Marcin

+0

私は十分に明確ではないことをお詫びし、あなたの提案に感謝します - 有用な解決策であるようです。あなたはそれが標準的なPythonライブラリ( 'いいえ'または '複雑すぎる'も単純な答えとして受け入れられる)を使って行うことができると思いますか?より多くの依存関係(この場合は 'functional')を避けたいと思います。 – Stiivi

関連する問題