最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深人了解Python上下文管理器

 更新時間:2021年12月08日 14:53:24   作者:測試開發(fā)小記  
這篇文章主要為大家介紹了Python上下文管理器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>

下面先來介紹一下with關鍵字在文件讀寫中的應用,簡單了解上下文管理器的功能。

with語句

Python文件及目錄處理方法中介紹了讀寫大文件建議使用with語句,with語句會進行資源的自動管理。文件很多的情況下也會導致資源泄露,下面來打開100000個文件,不進行文件關閉操作:

for x in range(100000):
    file = open('test.txt', 'w')
    file_descriptors.append(file)

執(zhí)行會報如下錯誤:

OSError: [Errno 24] Too many open files: 'test.txt'

原因就是打開了太多文件而沒有及時關閉導致了資源泄露,造成系統(tǒng)崩潰。完成處理后需要對文件進行關閉操作:

file_descriptors = []
for x in range(10000):
	file = open('test.txt', 'w')
	try:
		file_descriptors.append(file)
	finally:
		file.close()

使用 with 語句可以完成自動分配并且釋放資源,比上面的寫法更加簡潔:

file_descriptors = []
for x in range(10000):
	with open('test.txt', 'w') as file:
		file_descriptors.append(file)

上下文管理器創(chuàng)建

基于類的上下文管理器

可以使用類來創(chuàng)建上下文管理器,需要保證這個類包括兩個方法:__enter__() __exit__()。其中,方法 __enter__() 返回需要被管理的資源,方法 __exit__() 進行資源釋放、清理操作。

下面來模擬 Python 的打開、關閉文件操作:

class FileManager:
    def __init__(self, name, mode):
        print('__init__ method called')
        self.name = name
        self.mode = mode
        self.file = None
    def __enter__(self):
        print('__enter__ method called')
        self.file = open(self.name, self.mode)
        return self.file
    def __exit__(self, exc_type, exc_value, exc_traceback):
        print('__exit__ method called')
        if self.file:
            self.file.close()
        if exc_type:
            print(f'exc_type: {exc_type}')
            print(f'exc_value: {exc_value}')
            print(f'exc_traceback: {exc_traceback}')
        return True
with FileManager('test.txt', 'w') as f:
	print('開始寫操作')
	f.write('hello world !')
print(f.closed)

執(zhí)行結果:

__init__ method called
__enter__ method called
開始寫操作
__exit__ method called
exc_type: <class 'Exception'>
exc_value: exception raised
exc_traceback: <traceback object at 0x000001B43C2444C8>
True

可以看到執(zhí)行順序為:

  • __init__():初始化對象 FileManager
  • __enter__():打開文件,返回 FileManager 對象

with中的代碼

__exit__():關閉打開的文件流

__exit__()方法中的參數(shù)exc_type, exc_value, 和 exc_traceback 用于管理異常。

@contextmanager 裝飾器

可以使用 contextlib.contextmanager 裝飾器而不使用類的方式來實現(xiàn)上下文管理器,它是基于生成器的上下文管理器,用以支持 with 語句。

仍以打開、關閉文件為例:

from contextlib import contextmanager
@contextmanager
def file_manager(name, mode):
    try:
        f = open(name, mode)
        yield f
    finally:
        f.close()
with file_manager('test.txt', 'w') as f:
    f.write('hello world !')

其中 file_manager() 函數(shù)是一個生成器,yield 之前可以看成是__enter__方法中的內(nèi)容,yield 后面的是 __exit__() 內(nèi)容。加上@contextmanager裝飾器,使用基于生成器的上下文管理器時,不需要定義__enter__()__exit__()方法。

總結

上下文管理器可確保用過的資源得到迅速釋放,通常和 with 語句一起使用,大大提高了程序的簡潔度。另外需要注意的是,編寫基于類或者生成器的上下文管理器時,記住不要忘記釋放資源。--THE END--

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • 如何使用Python?繪制瀑布圖

    如何使用Python?繪制瀑布圖

    這篇文章主要介紹了如何使用Python?繪制瀑布圖,我們一起了解瀑布圖的重要性,以及如何使用不同的繪圖庫繪制瀑布圖。瀑布圖是一種二維圖表,專門用于了解隨著時間或多個步驟或變量的增量正負變化的影響,下文更多詳細內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Python數(shù)據(jù)結構與算法之算法分析詳解

    Python數(shù)據(jù)結構與算法之算法分析詳解

    算法分析的主要目標是從運行時間和內(nèi)存空間消耗等方面比較算法。本文將為大家詳細介紹Python數(shù)據(jù)結構與算法中的算法分析,需要的可以參考一下
    2021-12-12
  • Pytorch中的數(shù)據(jù)集劃分&正則化方法

    Pytorch中的數(shù)據(jù)集劃分&正則化方法

    這篇文章主要介紹了Pytorch中的數(shù)據(jù)集劃分&正則化方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • postman模擬訪問具有Session的post請求方法

    postman模擬訪問具有Session的post請求方法

    今天小編就為大家分享一篇postman模擬訪問具有Session的post請求方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調(diào)用的方法

    在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調(diào)用的方法

    今天小編就為大家分享一篇在Python中將函數(shù)作為另一個函數(shù)的參數(shù)傳入并調(diào)用的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python協(xié)程與?asyncio?庫詳情

    python協(xié)程與?asyncio?庫詳情

    這篇文章主要介紹了python協(xié)程與?asyncio?庫詳情,文章基于python展開詳細內(nèi)容,具有一定的參考價值。需要的小伙伴可以參考一下
    2022-05-05
  • python自然語言編碼轉換模塊codecs介紹

    python自然語言編碼轉換模塊codecs介紹

    這篇文章主要介紹了python自然語言編碼轉換模塊codecs介紹,codecs專門用作編碼轉換,通過它的接口是可以擴展到其他關于代碼方面的轉換,需要的朋友可以參考下
    2015-04-04
  • Python查詢IP地址歸屬完整代碼

    Python查詢IP地址歸屬完整代碼

    這篇文章主要介紹了Python查詢IP地址歸屬完整代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解決安裝Python的第三方庫pandas報錯問題

    解決安裝Python的第三方庫pandas報錯問題

    這篇文章主要介紹了解決安裝Python的第三方庫pandas報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python實現(xiàn)漸變色的水平堆疊圖

    Python實現(xiàn)漸變色的水平堆疊圖

    這篇文章主要為大家詳細介紹了Python實現(xiàn)漸變色的水平堆疊圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

霍邱县| 德安县| 山西省| 商城县| 达尔| 平陆县| 冷水江市| 天峨县| 双桥区| 丹东市| 曲松县| 左权县| 吉安县| 若羌县| 郯城县| 伊宁市| 河曲县| 湛江市| 仙居县| 南雄市| 宁强县| 东港市| 德兴市| 平南县| 漠河县| 泉州市| 新津县| 高平市| 新竹县| 勃利县| 高雄县| 临城县| 昌吉市| 留坝县| 新野县| 康乐县| 泽普县| 郴州市| 宁武县| 沁水县| 莎车县|