with語句支援由上下文管理器物件控制的執行時上下文執行一系列語句
執行with obj語句時,他執行方法obj.__enter__()來指示正在進入乙個新的上下文,當控制流離開該上下文時,就會執行方法obj.__exit__(exc_type, exc_val, exc_tb)。如果沒有引發異常,這三個引數都為none,否則他們將包含導致控制流離開上下文的異常相關的型別,值和跟蹤資訊。
with open("debuglog","a") as f:
f.write("aaa\n")
statements
進入with語句後自動開啟檔案,離開這個**塊之後,自動關閉檔案。
import threading
lock=threading,.lock()
with lock:
#關鍵部分
statements
#關鍵部分結束
在第二個例子中,當控制流進入with語句後面的**時自動請求乙個鎖定,而在控制流離開時自動釋放這個鎖定
#! /usr/bin/python#coding:utf-8
#with語句只對支援上下文管理協議(__enter__() 和__exit__())的物件有效
#使用者自定義的類可以實現這些方法,從而定義他們自己的上下文管理
#as var 中的var是說明符,如果指定了該說明符,obj.__enter__()的返回值將儲存在var中
class mywith(object):
def __init__(self,thelist):
self.thelist=thelist
def __enter__(self):
self.workingcopy=list(self.thelist)
return self.workingcopy
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is none:
self.thelist[:]=self.workingcopy
return false
items=[1,2,3]
with mywith(items) as w:
print items #[1, 2, 3, 4, 5]
try:
with mywith(items) as w:
raise runtimeerror("we're hosed ") #在修改的過程中如果發生異常,那麼修改修改就不會生效
except runtimeerror as e:
print e
print items #[1, 2, 3, 4, 5]
"通過包裝生成器函式,contextlib模組可以更加容易的實現自定義上下文管理器"
from contextlib import contextmanager
@contextmanager #裝飾器
def mywith2(thelist):
workingcopy=list(thelist)
yield workingcopy
#僅在沒有錯誤的時候才能修改原列表
thelist[:]=workingcopy
"""在上面這個例子中,把傳遞給yiled的值用作了__enter__()方法的返回值。呼叫__exit__()方法時,執行將在yield語句後回覆
"""with mywith2(items) as w:
print items
with與上下文管理器
def m1 f open source.txt w f.close 如果在呼叫 write 的過程中,出現了異常進而導致後續 無法繼續執行,close 方法無法被正常呼叫,因此資源就會一直被該程式占用,無法及時釋放占用的檔案資源。f open source.txt w try except exc...
with上下文管理器
在執行 with 語句時,首先執行 with 後面的 open 執行完 後,會將 的結果通過 as 儲存到 f 中 然後在下面實現真正要執行的操作 在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉 實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文...
with上下文管理器
上下文管理器 任何實現了enter 和exit 法的物件都可稱之為上下 管理 器,上下 管理器物件可以使 with 關鍵字。顯然,件 file 物件也實現 了上下 管理器 方法一class file def init self,filename,mode self.filename filename...