2014-10-20 40 views
1

我想要的行为,例如:Python的迭代和上下文管理

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" 

回答

6

您的contextmanager.__enter__方法需要返回可迭代。它可以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参数。

+0

如果你只是忽略任何异常,可能会更清楚地表明在签名时通过使用'def __exit __(self,* args)'。或者可能不是;我想这是一种风格问题。 – abarnert 2014-10-20 21:52:46