有一些任務,可能事先需要設定,事後做清理工作。比如會出現檔案操作後需要關閉檔案控制代碼的情況。對於這種場景,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可同時開啟多個...