2014-10-20 71 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