2012-04-28 97 views
0

我在閱讀PEP 343並試圖舉一些例子。但現在對我來說還不是很清楚。特別是因爲我有一個錯誤:Python與聲明

>>> def f(): 
...  return 'f' 
... 
>>> with f(): # or as f 
...  print f() # or f 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: __exit__ 

事實上,函數沒有方法__exit__。那麼你如何使用with聲明?

+0

是非常有用的文件,因爲它調用了'close'自動上'__exit__' – jamylak 2012-04-28 21:56:51

+2

,你會想到什麼'和f():打印F()'來完成? – weronika 2012-04-28 22:00:22

回答

3

如果要在函數中使用with語句,可以使用contextlib.contextmanager裝飾器。

例如,從doc

from contextlib import contextmanager 

@contextmanager 
def tag(name): 
    print "<%s>" % name 
    yield 
    print "</%s>" % name 

>>> with tag("h1"): 
... print "foo" 
... 
<h1> 
foo 
</h1> 
+0

@senderle:這是真的:) – mouad 2012-04-28 21:58:07

+0

問題是「你如何使用with語句?」不是「有沒有一個庫使用帶聲明的函數?」。我不知道爲什麼這個答案被接受。 – 2015-03-04 10:46:00

+0

@ zoogleflatt因爲它回答OP X問題http://mywiki.wooledge.org/XyProblem :) – mouad 2015-03-04 13:59:32