import sys
class test:
def __enter__(self):
print "enter"
return 1
def __exit__(self,*args):
print "exit"
return true
with test() as t:
print "t is not the result of test().it is __enter__ returned"
print "t is 1,yes,it is ".format(t)
#raise nameerror("hi here")
#sys.exit()
print "never here"
在使用鎖機制時, 經常會用到with 語句
import threading
_lock = threading.lock()
with _lock:
...
如果有乙個類包含 __enter__ 方法和 __exit__ 方法,像這樣:
class controlled_execution:
def__enter__(self):
set things up
return thing
def__exit__(self, type, value, traceback):
tear things down
那麼它就可以和with一起使用,像這樣:
with controlled_execution() as thing:some code
當with語句被執行的時候,python對表示式進行求值,對求值的結果(叫做「內容守護者」)呼叫__enter__方法,並把__enter__
方法的返回值賦給as後面的變數。然後python會執行接下來的程式碼段,並且無論這段程式碼幹了什麼,都會執行「內容守護者」的__exit__
方法。
作為額外的紅利,__exit__方法還能夠在有exception的時候看到exception,並且壓制它或者對它做出必要的反應。要壓制exception,只需要返回乙個true。比如,下面的__exit__方法吞掉了任何的typeerror,但是讓所有其他的exceptions通過:
def __exit__(self, type, value, traceback):
return isinstance(value, typeerror)在python2.5中,file object擁有__enter__和__exit__方法,前者僅僅是返回object自己,而後者則關閉這個檔案:
>>> f = open("x.txt")
>>> f
>>> f.__enter__()
>>> f.read(1)
'x' >>> f.__exit__(none, none, none)
>>> f.read(1)
traceback (most recent call last):
file "", line 1, in valueerror: i/o operation on closed file
這樣要開啟乙個檔案,處理它的內容,並且保證關閉它,你就可以簡簡單單地這樣做:
with open("x.txt") as f:
data = f.read()
do something with data我的補充:
資料庫的連線好像也可以和with一起使用,我在一本書上看到以下內容:
conn = sqlite.connect("somedb")
with conn:
conn.execute("insert into sometable values (?,?)",("foo","bar"))
在這個例子中,commit()是在所有with資料塊中的語句執行完畢並且沒有錯誤之後自動執行的,如果出現任何的異常,將執行rollback()
操作,再次提示異常。
Python with語句定義及使用
方法 1 首先介紹下with 工作原理 緊跟with後面的語句被求值後,返回物件的 enter 方法被呼叫,這個方法的返回值將被賦值給as後面的變數 當with後面的 塊全部被執行完之後,將呼叫前面返回物件的 exit 方法。with工作原理 示例 class sample def enter se...
Python with語句和過程抽取思想
python中的with語句使用於對資源進行訪問的場合,保證不管處理過程中是否發生錯誤或者異常都會執行規定的 exit 清理 操作,釋放被訪問的資源,比如有檔案讀寫後自動關閉 執行緒中鎖的自動獲取和釋放等。與python中with語句有關的概念有 上下文管理協議 上下文管理器 執行時上下文 上下文表...
python with用法詳解
coding utf8 def except try try print start raise keyerror raise indexerror return 1 except keyerror print key error 異常時執行 return 2 else print other er...