上下文管理器與with語句(筆記)

2022-09-10 14:42:27 字數 1759 閱讀 9974

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...