【发布时间】:2016-04-12 14:14:56
【问题描述】:
假设我有两个不纯函数 - f 和 j。 j 生成一个批次中的项目列表, f 生成一个批次列表。他们俩都有一些清理工作要做。
我需要做的是为客户端代码提供扁平化的项目列表,同时对 f 和 j 进行清理。一种方法是使用带有 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
编辑1。它实际上不起作用,因为它在 j 之前和 j 之后在实际消耗值之前执行。
【问题讨论】:
标签: python generator list-comprehension contextmanager