python中的with語句

2021-10-07 02:25:21 字數 2303 閱讀 7976

有一些任務,可能事先需要設定,事後做清理工作。比如會出現檔案操作後需要關閉檔案控制代碼的情況。對於這種場景,python的with語句提供了一種非常方便的處理方式。

with表示式其實是try-finally的簡寫形式。但是又不是全相同。

使用方法:

with context [as var]:

pass

其中的context是乙個表示式,返回的是乙個物件,var用來儲存context表示式返回的物件,可以有單個或者多個返回值。

例子1:

但是with本身並沒有異常捕獲的功能,但是如果發生了執行時異常,它照樣可以關閉檔案釋放資源。

例子2:

with open('b.txt') as f:

print(f.read())

traceback (most recent call last):

file "e:/python/pythoncode/lab_x/demo08.py", line 28, in

with open('b.txt') as f:

filenotfounderror: [errno 2] no such file or directory: 'b.txt'

這個例子可以看出with沒有捕獲異常的功能。

例子3:

try:

with open('b.txt') as f:

print(f.read())

except exception as e:

print("error")

輸出:error

這個例子可以看出with發生了異常也會關閉程式。

工作原理:

緊跟with後面的語句會被求值,返回物件的__enter__()方法被呼叫,這個方法的返回值將被賦值給as關鍵字後面的變數,當with後面的**塊全部被執行完之後,將呼叫前面返回物件的__exit__()方法。 with語句最關鍵的地方在於被求值物件必須有__enter__()和__exit__()這兩個方法,那我們就可以通過自己實現這兩方法來自定義with語句處理異常。

術語

上下文管理協議(context management protocol):包含方法 __enter__() 和 __exit__(),支援該協議的物件要實現這兩個方法。

上下文管理器(context manager):支援上下文管理協議的物件,這種物件實現了__enter__() 和 __exit__() 方法。上下文管理器定義執行 with 語句時要建立的執行時上下文,負責執行 with 語句塊上下文中的進入與退出操作。

執行時上下文(runtime context):由上下文管理器建立,通過上下文管理器的 __enter__() 和__exit__() 方法實現,__enter__() 方法在語句體執行之前進入執行時上下文,__exit__() 在語句體執行完後從執行時上下文退出。with 語句支援執行時上下文這一概念。

上下文表示式(context expression):with語句中跟在關鍵字with之後的表示式,該表示式要返回乙個上下文管理器物件。

語句體(with-body):with語句包裹起來的**塊,在執行語句體之前會呼叫上下文管理器的 __enter__() 方法,執行完語句體之後會執行 __exit__() 方法。

自定義類

自定義類必須包含上述幾個方法才能正確使用with關鍵字。

class mycontex(object):

def __init__(self,name):

self.name=name

def __enter__(self):

print("hello")

return self

def do_self(self):

print('my name is '+self.name)

def __exit__(self,exc_type,exc_value,traceback):

print("bye!")

print(exc_type,exc_value)

if __name__ == '__main__':

with mycontex('test') as mc:

mc.do_self()

輸出結果:

hello

my name is test

bye!

none none

Python中的for語句

for語句是python中的迴圈控制語句。可用來遍歷某一物件,還具有乙個附帶的可選的else塊,主要用於處理for語句中包含的break語句。如果for迴圈未被break終止,則執行else塊中的語句。break 在需要時終止for迴圈 continue 跳過位於其後的語句,開始下一輪迴圈。for語...

python中的if語句

程式設計時常需要檢查一系列條件,並根據結果採取措施,在python中,if語句能幫你檢查程式當前狀態,並給出結果採取措施。下面是乙個簡單的例項,演示if語句正確處理特殊情況 cars audi bmw toyota for car in cars if car toyata print car.up...

Python中的with語句

with語句用處 檔案操作時,時常有忘記關閉的情況,因此可以選用with語句,with語句執行完,檔案自動關閉且釋放檔案資源。eg 關閉1個檔案 with open poem1 r encoding utf 8 as f for line in f print line eg with可同時開啟多個...