让我们考虑一下代码示例:
class Foobar():
def __init__(self, x):
self.x = x
def __enter__(self):
print("inside enter", self)
return self
def __exit__(self, *args):
print("inside exit", self)
# Save self.data to disk
def get(self):
return self.x
def set(self, data):
# Set some data, that is then written in __exit__
self.data = data
def gen():
for i in range(10):
with Foobar(i) as f:
yield f
基本概念是拥有一个带有上下文管理器的类和一个生成这些对象的生成器。通常的情况是这样称呼它:
for x in gen():
# Manipulate the Object
x.set("foobar")
在这种情况下,每个对象都被写入,现在我们首先应用过滤器:
for x in filter(lambda x: x.get() % 2 == 0, gen()):
x.set("foobar")
现在的问题是,被操纵的对象没有被写入磁盘,因为在过滤器函数中实际调用了__exit__
函数。
是否可以在循环中加上过滤工作上下文管理器?
当然,可以编写另一个gen()
函数,只生成某些对象,但在对象上使用filter()
要方便得多。
另一种方法是在循环中过滤,例如
for x in gen():
if x.get() % 2 == 0:
x.set("foobar")