Python可迭代和上下文管理器

时间:2014-10-20 21:43:56

标签: python contextmanager

我想要这样的行为:

with A() as f:
    for x in f:
        do_something(f)

这是正确的方法吗?

class A:
    def __enter__(self):
        print "Entering context"

    def __iter__(self):
        for x in ["some","list"]:
            yield x

    def __exit__(self):
        print "Deleting context"

1 个答案:

答案 0 :(得分:6)

您的contextmanager.__enter__方法需要返回iterable。它可以self

def __enter__(self):
    print "Entering context"
    return self

请参阅With Statement Context Managers documentation

  

object.__enter__(self)

     

输入与此对象相关的运行时上下文。 with语句将此方法的返回值绑定到语句的as子句中指定的目标(如果有)。

所以无论方法返回什么,然后绑定到作为as目标给出的名称。

如果提出异常,您的contextmanager.__exit__ method需要能够接受该异常:

def __exit__(self, exc_type, exc_value, traceback):

当没有异常时,with语句会给你三个None个参数。

相关问题