1
私には2つの不純な関数 - fとjがあるとします。 jは1つのバッチでアイテムのリストを生成し、fはバッチのリストを生成します。どちらも何かすべきことがあります。リスト内包を持つPythonのネストされたコンテキストマネージャ
私がする必要があるのは、fとjの両方でクリーンアップを行いながら、クライアントコードにアイテムのフラット化されたリストを提供することです。これを行う1つの方法は、forループでyieldを使ってクリーンアップを行うジェネレータを使用することですが、その場合クリーンアップが存在することが明示的ではないので、そのようには気に入らないのです。
だから私は(このコードでdumb
と呼ばれる)ラッパー関数
from contextlib import contextmanager
from split import chop
from itertools import chain
from functools import wraps
xs = list(chop(3, xrange(9)))
def dumb(manager):
@wraps(manager)
def g(*args, **kwargs):
with manager(*args, **kwargs) as something:
return something
return g
@dumb
@contextmanager
def j(index):
print('before j')
yield xs[index]
print('after j')
@contextmanager
def f():
print('before f')
yield chain.from_iterable(j(i) for i in xrange(len(xs)))
print('after f')
with f() as ns:
for x in ns:
print(x)
プリント
before f
before j
after j
0
1
2
before j
after j
3
4
5
before j
after j
6
7
8
after f
EDIT1を使用していることを行う方法を発見しました。実際には値が実際に消費される前にjとjの後に実行されているため、実際には機能しません。
これはうまくいきました。これをj(i)として '' 'で解決する機会はありますか?item in it:yield item'''? – user1685095
あなたの明示的なクリーンアップの要件との関連性は不明です。 – Dunes