ChainMap コンテキストのツリーを作成し、最終的にツリーの最後にあるコンテキストで何かを行う再帰的なジェネレーター関数があります。次のようになります (parent_context
は ChainMap、hierarchy
はリストです):
def recursive_generator(parent_context, hierarchy):
next_level = hierarchy[0]
next_level_contexts = get_contexts(next_level) # returns a list of dicts
for context in next_level_contexts:
child_context = parent_context.new_child().update(context)
if next_level == hierarchy[-1]:
yield do_something(**child_context)
else:
yield from recursive_generator(child_context, hierarchy[1:])
ここで、階層の 1 つのレベルにフラグを立てて、そのレベルの終了後に操作を中断し、状態をディスクにシリアル化して、後で中断したところから取得したいと考えています。再帰の優雅さを失わずにこれを行う方法はありますか?
ジェネレーターをピクルできないことはわかっているので、イテレーター オブジェクトにリファクタリングすることを考えました。しかし、ここでの再帰には必要だと思いyield from
ます(編集:少なくともスタックの面倒な管理なしで)ので、ジェネレーターである必要があると思いますか?これに対する回避策はありますか?