亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

正確理解python中的關鍵字“with”與上下文管理器

 更新時間:2017年04月21日 16:49:32   作者:FOOFISH  
這篇文章主要介紹了關于python中關鍵字"with"和上下文管理器的相關資料,文中介紹的非常詳細,相信對大家學習或者使用python具有一定的參考價值,需要的朋友們下面來一起看看吧。

前言

如果你有閱讀源碼的習慣,可能會看到一些優(yōu)秀的代碼經常出現帶有 “with” 關鍵字的語句,它通常用在什么場景呢?今天就來說說 with 和 上下文管理器。

對于系統資源如文件、數據庫連接、socket 而言,應用程序打開這些資源并執(zhí)行完業(yè)務邏輯之后,必須做的一件事就是要關閉(斷開)該資源。

比如 Python 程序打開一個文件,往文件中寫內容,寫完之后,就要關閉該文件,否則會出現什么情況呢?極端情況下會出現 "Too many open files" 的錯誤,因為系統允許你打開的最大文件數量是有限的。

同樣,對于數據庫,如果連接數過多而沒有及時關閉的話,就可能會出現 "Can not connect to MySQL server Too many connections",因為數據庫連接是一種非常昂貴的資源,不可能無限制的被創(chuàng)建。

來看看如何正確關閉一個文件。

普通版:

def m1():
 f = open("output.txt", "w")
 f.write("python之禪")
 f.close()

這樣寫有一個潛在的問題,如果在調用 write 的過程中,出現了異常進而導致后續(xù)代碼無法繼續(xù)執(zhí)行,close 方法無法被正常調用,因此資源就會一直被該程序占用者釋放。那么該如何改進代碼呢?

進階版:

def m2():
 f = open("output.txt", "w")
 try:
 f.write("python之禪")
 except IOError:
 print("oops error")
 finally:
 f.close()

改良版本的程序是對可能發(fā)生異常的代碼處進行 try 捕獲,使用 try/finally 語句,該語句表示如果在 try 代碼塊中程序出現了異常,后續(xù)代碼就不再執(zhí)行,而直接跳轉到 except 代碼塊。而無論如何,finally 塊的代碼最終都會被執(zhí)行。因此,只要把 close 放在 finally 代碼中,文件就一定會關閉。

高級版:

def m3():
 with open("output.txt", "w") as f:
 f.write("Python之禪")

一種更加簡潔、優(yōu)雅的方式就是用 with 關鍵字。open 方法的返回值賦值給變量 f,當離開 with 代碼塊的時候,系統會自動調用 f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。那么它的實現原理是什么?

在講 with 的原理前要涉及到另外一個概念,就是上下文管理器(Context Manager)。

上下文管理器

任何實現了 __enter__() __exit__() 方法的對象都可稱之為上下文管理器,上下文管理器對象可以使用 with 關鍵字。顯然,文件(file)對象也實現了上下文管理器。

那么文件對象是如何實現這兩個方法的呢?我們可以模擬實現一個自己的文件類,讓該類實現 __enter__() __exit__() 方法。

class File():

 def __init__(self, filename, mode):
 self.filename = filename
 self.mode = mode

 def __enter__(self):
 print("entering")
 self.f = open(self.filename, self.mode)
 return self.f

 def __exit__(self, *args):
 print("will exit")
 self.f.close()

__enter__() 方法返回資源對象,這里就是你將要打開的那個文件對象, __exit__() 方法處理一些清除工作。

因為 File 類實現了上下文管理器,現在就可以使用 with 語句了。

with File('out.txt', 'w') as f:
 print("writing")
 f.write('hello, python')

這樣,你就無需顯示地調用 close 方法了,由系統自動去調用,哪怕中間遇到異常 close 方法也會被調用。

contextlib

Python 還提供了一個 contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函數分割成兩部分,yield 之前的語句在 __enter__ 方法中執(zhí)行,yield 之后的語句在 __exit__ 方法中執(zhí)行。緊跟在 yield 后面的值是函數的返回值。

from contextlib import contextmanager

@contextmanager
def my_open(path, mode):
 f = open(path, mode)
 yield f
 f.close()

調用

with my_open('out.txt', 'w') as f:
 f.write("hello , the simplest context manager")

總結

Python 提供了 with 語法用于簡化資源操作的后續(xù)清除操作,是 try/finally 的替代方法,實現原理建立在上下文管理器之上。此外,Python 還提供了一個 contextmanager 裝飾器,更進一步簡化上下管理器的實現方式。以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Python基本數據類型詳細介紹

    Python基本數據類型詳細介紹

    Python提供的基本數據類型主要有:布爾類型、整型、浮點型、字符串、列表、元組、集合、字典等等
    2014-03-03
  • Python基于Tkinter實現的記事本實例

    Python基于Tkinter實現的記事本實例

    這篇文章主要介紹了Python基于Tkinter實現的記事本,實例分析了Tkinter實現記事本程序的相關技巧,需要的朋友可以參考下
    2015-06-06
  • python給指定csv表格中的聯系人群發(fā)郵件(帶附件的郵件)

    python給指定csv表格中的聯系人群發(fā)郵件(帶附件的郵件)

    這篇文章主要介紹了python給指定csv表格中的聯系人群發(fā)郵件,本文通過代碼講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Python中經常使用的代碼片段

    Python中經常使用的代碼片段

    大家好,本篇文章主要講的是Python中經常使用的代碼片段,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python實現基于Excel數據繪制棋盤圖

    Python實現基于Excel數據繪制棋盤圖

    這篇文章主要為大家介紹了如何根據可視化的需要,利用Python將Excel中的數據用棋盤圖的樣式來展示,文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-07-07
  • python使用PIL剪切和拼接圖片

    python使用PIL剪切和拼接圖片

    這篇文章主要為大家詳細介紹了python使用PIL剪切和拼接圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python3爬蟲學習之MySQL數據庫存儲爬取的信息詳解

    Python3爬蟲學習之MySQL數據庫存儲爬取的信息詳解

    這篇文章主要介紹了Python3爬蟲學習之MySQL數據庫存儲爬取的信息,涉及Python3針對mysql數據庫的連接、信息存儲等相關操作技巧,需要的朋友可以參考下
    2018-12-12
  • Django的多表查詢操作實戰(zhàn)

    Django的多表查詢操作實戰(zhàn)

    Django提供一種強大而又直觀的方式來"處理"查詢中的關聯關系,它在后臺自動幫你處理JOIN,下面這篇文章主要給大家介紹了關于Django多表查詢操作的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • python多任務之協程的使用詳解

    python多任務之協程的使用詳解

    這篇文章主要介紹了python多任務之協程的使用,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Pytorch中torchtext終極安裝方法以及常見問題

    Pytorch中torchtext終極安裝方法以及常見問題

    torchtext是pytorch框架中用于文本處理的,下面這篇文章主要給大家介紹了關于Pytorch中torchtext終極安裝方法以及常見問題的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05

最新評論