您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關with語句如何在Python項目中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
首先,需要思索下為什么需要引入上下文管理器。
在正常情況下,管理各種系統資源(如文件)、數據庫連接時,通常是先打開這些資源,執行完相應的業務邏輯,最后關閉資源。
舉兩個例子:
1.使用Python打開一個文件寫入內容,之后需要關閉這個文件。如果不正常關閉的話可能會在文件操作時出現異常,因為系統允許你打開的文件的最大數是有限的。
2.在數據庫連接時也是存在類似問題,數據庫的連接算是一種比較昂貴的資源,若連接過多而沒有及時關閉的話,就可能出現不能繼續連接的異常錯誤。
但是,很多程序員經常會忘記關閉文件,或者關閉數據庫的連接。這時候就引入了上下文管理器,它可以在你不需要該對象的時候,自動關閉它。
上下文管理器怎么使用?
上下文管理器的語法是:with...as...
實例:文件操作
print "不使用上下文管理器" print "*" * 30 f = open('file.py', 'w') print f.closed f.write("# Hello World") f.close() print f.closed print "\n使用上下文管理器" print "*" * 30 with open("file.py", 'w') as f: print f.closed f.write('# Hello Python') print f.closed
這里通過.closed比較,我們可以看到上下文管理器可以自動關閉文件,對于上下文管理器而言,有隸屬于它的程序塊,當隸屬于它的程序塊執行結束的時候(判斷縮進),上下文管理器將自動關閉文件。
上述實例,也可以使用try...except...來實現,同樣可以很直觀的看到使用with...as...語句之后,代碼確實相對更加簡潔。
上下文管理實現機制
因為文件對象是Python的內置對象,內置了上下文管理的特殊方法,所以它可以使用with語句。在Python中,任何對象,只要實現了上下文管理,就可以使用with語句,實現上下文管理需要通過__enter__和__exit__這兩個方法來實現。
關于這兩個方法:
enter(self):進入該對象時調用此方法,返回值將放入with...as...語句中的as說明的變量中
exit(self, type, value, tb):離開上下文管理器時調用該方法,如果有異常出現,返回False,type、value和tb將分別表示異常的類型、值和追蹤信息,傳遞出上下文顯示;如果沒有異常,則三個變量的值均為None。
with 上下文管理器:
語法體
當with語句遇到上下文管理器時,就會在執行語法體之前,先執行__enter__方法,然后再執行語法體,執行完語法體之后,執行__exit__方法。
上下文管理器實現
使用Python2.7X實現一個上下文管理器:
class Context(object): def __init__(self): print "實例化一個對象" def __enter__(self): print "獲取該對象" def __exit__(self, exc_type, exc_val, exc_tb): print "退出該對象" temp = Context() with temp: print "執行體"
這樣,__enter__方法和__exit__方法的調用過程就很明晰。
contextLib
在contextlib中,提供了contextmanager裝飾器,通過yield返回函數將函數分隔為兩部分,yield之前的語句在__enter__中執行,yield之后的語句在__exit__中執行,簡化了上下文管理器的實現方式:
總結:通過上下文管理器,我們可以更好的控制對象在不同區間的特性,并且可以使用with語句替代try...except方法,使得代碼更加的簡潔,主要的使用場景是訪問資源,可以保證不管過程中是否發生錯誤或者異常都會執行相應的清理操作,釋放出訪問的資源。
看完上述內容,你們對with語句如何在Python項目中使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。