Python可迭代和上下文管理器

yay*_*ayu 1 python contextmanager

我想要这样的行为:

with A() as f:
    for x in f:
        do_something(f)
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

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

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

    def __exit__(self):
        print "Deleting context"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

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

def __enter__(self):
    print "Entering context"
    return self
Run Code Online (Sandbox Code Playgroud)

请参阅With Statement Context Managers文档:

object.__enter__(self)

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

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

如果引发异常,您的contextmanager.__exit__方法需要能够接受异常:

def __exit__(self, exc_type, exc_value, traceback):
Run Code Online (Sandbox Code Playgroud)

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