一連の「構成」を生成するシステムをセットアップしようとしています。これらの構成は、Pythondictに格納されている単純なキーと値のペアです。
これらの構成は、一連の関数を使用してdictを変換した結果です。これは、私がワークフローと呼んでいるものです。
これが私が最終的に得たものの簡単な例です:
global_data = [dict()]
def workflow_step1(data):
results = []
for i in range(1,4):
data['key'] = i
results.append(copy.deepcopy(data))
return results
def workflow_step2(data):
results = []
for i in range(1,3):
data['otherkey'] = i
results.append(copy.deepcopy(data))
return results
def workflow_step3(data):
data['yetanotherkey'] = 42
return [copy.deepcopy(data)]
def list_workflow():
return [workflow_step1, workflow_step2, workflow_step3]
def merge(lhs,rhs):
return lhs+rhs
def run(data):
for step in list_workflow():
data = reduce(lambda lhs, rhs: lhs+rhs, [step(d) for d in data])
return data
print run(global_data)
これはうまく機能します、私は得ます:
[{'yetanotherkey': 42, 'otherkey': 1, 'key': 1},
{'yetanotherkey': 42, 'otherkey': 2, 'key': 1},
{'yetanotherkey': 42, 'otherkey': 1, 'key': 2},
{'yetanotherkey': 42, 'otherkey': 2, 'key': 2},
{'yetanotherkey': 42, 'otherkey': 1, 'key': 3},
{'yetanotherkey': 42, 'otherkey': 2, 'key': 3}]
ご覧のとおり、目標はdictのすべての可能な組み合わせを取得することです。ワークフローの各ステップは、可能な組み合わせのセットを返します。これにより、次のステップの可能性の新しいブランチが作成されます。
私が直面している問題は、ユーザーがますます多くのワークフローステップを作成しているため、組み合わせ爆発につながることです。
私の素朴なデザインの問題は、すべての可能性のツリー全体を一度に生成することです。
yield
私は、ジェネレーターを使用してこれを解決し、一度に1つの可能性を生成して、すべてを同時に保存しないことを望んでいました。
もちろん、yieldを使用してワークフローステップを書き直すことができました。
def workflow_step1(data):
for i in range(1,4):
data['key'] = i
yield copy.deepcopy(data)
def workflow_step2(data):
for i in range(1,3):
data['otherkey'] = i
yield copy.deepcopy(data)
def workflow_step3(data):
data['yetanotherkey'] = 42
yield copy.deepcopy(data)
def list_workflow():
yield workflow_step1
yield workflow_step2
yield workflow_step3
run
しかし、各ステップを順番に処理するように関数を書き直す方法を頭の中で考えさせることはできません。私は収量と発電機の頭脳迷路に迷いました。
どんなアイデアでも大歓迎です!