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

詳解Python中的with語(yǔ)句和上下文管理器

 更新時(shí)間:2022年10月18日 12:52:56   作者:Amo Xiang  
上下文管理器可以使用 with 語(yǔ)句,with 語(yǔ)句之所以這么強(qiáng)大,背后是由上下文管理器做支撐的,也就是說(shuō)剛才使用 open 函數(shù)創(chuàng)建的文件對(duì)象就是就是一個(gè)上下文管理器對(duì)象,這篇文章主要介紹了詳解Python中的with語(yǔ)句和上下文管理器,需要的朋友可以參考下

如果你有閱讀源碼的習(xí)慣,可能會(huì)看到一些優(yōu)秀的代碼經(jīng)常出現(xiàn)帶有 with 關(guān)鍵字的語(yǔ)句,它通常用在什么場(chǎng)景呢?對(duì)于系統(tǒng)資源如文件、數(shù)據(jù)庫(kù)連接、socket 而言,應(yīng)用程序打開這些資源并執(zhí)行完業(yè)務(wù)邏輯之后,必須做的一件事就是要關(guān)閉(斷開)該資源。

比如 Python 程序打開一個(gè)文件,往文件中寫內(nèi)容,寫完之后,就要關(guān)閉該文件,否則會(huì)出現(xiàn)什么情況呢?極端情況下會(huì)出現(xiàn) Too many open files 的錯(cuò)誤,因?yàn)橄到y(tǒng)允許你打開的最大文件數(shù)量是有限的。同樣,對(duì)于數(shù)據(jù)庫(kù),如果連接數(shù)過(guò)多而沒(méi)有及時(shí)關(guān)閉的話,就可能會(huì)出現(xiàn) Can not connect to MySQL server Too many connections,因?yàn)閿?shù)據(jù)庫(kù)連接是一種非常昂貴的資源,不可能無(wú)限制的被創(chuàng)建。

一、with語(yǔ)句的使用

向文件中寫入數(shù)據(jù)的示例代碼(基礎(chǔ)):

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:25
# @Author  : AmoXiang
# @File    : demo1.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

# 1、以寫的方式打開文件
f = open("1.txt", "w", encoding="utf8")
# 2、寫入文件內(nèi)容
f.write("hello world")
# 3、關(guān)閉文件
f.close()

代碼說(shuō)明如下:文件使用完后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的。這種寫法可能出現(xiàn)一定的安全隱患,錯(cuò)誤代碼如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:25
# @Author  : AmoXiang
# @File    : demo1.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

# 1、以寫的方式打開文件
f = open("1.txt", "r", encoding="utf8")
# 2、寫入文件內(nèi)容
f.write("hello world")
# 3、關(guān)閉文件
f.close()

運(yùn)行結(jié)果如下圖所示:

在這里插入圖片描述

代碼說(shuō)明:由于文件讀寫時(shí)都有可能產(chǎn)生 IOError,一旦出錯(cuò),后面的 f.close() 就不會(huì)調(diào)用。為了保證無(wú)論是否出錯(cuò)都能正確地關(guān)閉文件,我們可以使用 try ... finally 來(lái)解決。安全寫法, 代碼如下:

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:32
# @Author  : AmoXiang
# @File    : demo2.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


try:
    # 1、以讀的方式打開文件
    f = open("1.txt", "r")
    # 2、讀取文件內(nèi)容
    f.write("xxxxx")

except IOError as e:
    print("文件操作出錯(cuò)", e)

finally:
    # 3、關(guān)閉文件
    f.close()

運(yùn)行結(jié)果:

文件操作出錯(cuò) not writable

這種方法雖然代碼運(yùn)行良好,但是缺點(diǎn)就是代碼過(guò)于冗長(zhǎng),并且需要添加 try-except-finally 語(yǔ)句,不是很方便,也容易忘記。在這種情況下,Python 提供了 with 語(yǔ)句的這種寫法,既簡(jiǎn)單又安全,并且 with 語(yǔ)句執(zhí)行完成以后自動(dòng)調(diào)用關(guān)閉文件操作,即使出現(xiàn)異常也會(huì)自動(dòng)調(diào)用關(guān)閉文件操作。with 語(yǔ)句的示例代碼:

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:34
# @Author  : AmoXiang
# @File    : demo3.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

# 1、以寫的方式打開文件
with open("1.txt", "w") as f:
    # 2、讀取文件內(nèi)容
    f.write("hello world")
    f.read()  # 即使報(bào)錯(cuò),文件資源也會(huì)關(guān)閉掉

二、上下文管理器

一個(gè)類只要實(shí)現(xiàn)了 __enter__()__exit__() 這個(gè)兩個(gè)方法,通過(guò)該類創(chuàng)建的對(duì)象我們就稱之為上下文管理器對(duì)象。上下文管理器可以使用 with 語(yǔ)句,with 語(yǔ)句之所以這么強(qiáng)大,背后是由上下文管理器做支撐的,也就是說(shuō)剛才使用 open 函數(shù)創(chuàng)建的文件對(duì)象就是就是一個(gè)上下文管理器對(duì)象。自定義上下文管理器類,模擬文件操作。定義一個(gè) File 類,實(shí)現(xiàn) __enter__()__exit__() 方法,然后使用 with 語(yǔ)句來(lái)完成操作文件, 示例代碼:

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:38
# @Author  : AmoXiang
# @File    : demo4.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

class File(object):
    # 初始化方法
    def __init__(self, file_name, mode):
        # 定義變量保存文件名和打開模式
        self.file_name = file_name
        self.mode = mode

    # 上文方法
    def __enter__(self):
        print("進(jìn)入上文方法")
        # 返回文件資源
        self.f = open(self.file_name, self.mode)
        return self.f

    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        with 語(yǔ)句中,即使發(fā)生異常信息,也會(huì)進(jìn)入 __exit__ 中
        :param exc_type: 發(fā)生異常時(shí),異常的類型
        :param exc_val: 發(fā)生異常時(shí),異常的信息
        :param exc_tb: 異常對(duì)象,堆棧信息
        :return:如果返回False(代碼沒(méi)有書寫返回值默認(rèn)None,表示為False) 代表
        異常發(fā)生以后,異常會(huì)繼續(xù)向外傳遞。如果返回True,代表異常不再向外傳遞
        """
        if exc_type:
            print("發(fā)生了異常......")
            return True
        print("進(jìn)入下文方法")
        self.f.close()


if __name__ == '__main__':
    with File("1.txt", "r") as file:
        content = file.read()
        print(content)

運(yùn)行結(jié)果:

在這里插入圖片描述

代碼說(shuō)明:

  • __enter__ 表示上文方法,需要返回一個(gè)操作文件對(duì)象
  • __exit__ 表示下文方法,with 語(yǔ)句執(zhí)行完成會(huì)自動(dòng)執(zhí)行,即使出現(xiàn)異常也會(huì)執(zhí)行該方法。

上下文管理器的另外一種實(shí)現(xiàn)方式: 假如想要讓一個(gè)函數(shù)成為上下文管理器,Python 還提供了一個(gè) @contextmanager 的裝飾器,更進(jìn)一步簡(jiǎn)化了上下文管理器的實(shí)現(xiàn)方式。通過(guò) yield 將函數(shù)分割成兩部分,yield 上面的語(yǔ)句在 __enter__ 方法中執(zhí)行,yield 下面的語(yǔ)句在 __exit__ 方法中執(zhí)行,緊跟在 yield 后面的參數(shù)是函數(shù)的返回值。示例代碼:

# -*- coding: utf-8 -*-
# @Time    : 2022-10-18 10:54
# @Author  : AmoXiang
# @File    : demo5.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

# 導(dǎo)入裝飾器
from contextlib import contextmanager


# 裝飾器裝飾函數(shù),讓其稱為一個(gè)上下文管理器對(duì)象
@contextmanager
def my_open(path, mode):
    try:
        # 打開文件
        file = open(path, mode)
        # yield之前的代碼好比是上文方法
        yield file
    except Exception as e:
        print(e)
    finally:
        print("over")
        # yield下面的代碼好比是下文方法
        file.close()


# 使用with語(yǔ)句
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

三、小結(jié)

Python 提供了 with 語(yǔ)句 用于簡(jiǎn)化資源釋放的操作,使用 with 語(yǔ)句 操作建立在上下文管理器(實(shí)現(xiàn) __enter____exit__ ) 的基礎(chǔ)上。Python 還提供了一個(gè) @contextmanager 裝飾器,更進(jìn)一步簡(jiǎn)化上下管理器的實(shí)現(xiàn),讓一個(gè)函數(shù)可以成為上下文管理器,結(jié)合 with 語(yǔ)句 來(lái)使用。

到此這篇關(guān)于詳解Python中的with語(yǔ)句和上下文管理器的文章就介紹到這了,更多相關(guān)Python with語(yǔ)句和上下文管理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python腳本實(shí)現(xiàn)mp4中的音頻提取并保存在原目錄

    python腳本實(shí)現(xiàn)mp4中的音頻提取并保存在原目錄

    這篇文章主要介紹了python腳本實(shí)現(xiàn)mp4中的音頻提取并保存在原目錄,本文給大家通過(guò)實(shí)例代碼介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python中Anaconda3 安裝gdal庫(kù)的方法

    Python中Anaconda3 安裝gdal庫(kù)的方法

    這篇文章主要介紹了Python中Anaconda3 安裝gdal庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • python實(shí)現(xiàn)探測(cè)socket和web服務(wù)示例

    python實(shí)現(xiàn)探測(cè)socket和web服務(wù)示例

    這篇文章主要介紹了python實(shí)現(xiàn)探測(cè)socket和web服務(wù)示例,需要的朋友可以參考下
    2014-03-03
  • 用Python將Excel數(shù)據(jù)導(dǎo)入到SQL Server的例子

    用Python將Excel數(shù)據(jù)導(dǎo)入到SQL Server的例子

    今天小編就為大家分享一篇用Python將Excel數(shù)據(jù)導(dǎo)入到SQL Server的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python安裝/卸載模塊方法步驟詳解(附詳細(xì)圖解)

    python安裝/卸載模塊方法步驟詳解(附詳細(xì)圖解)

    在日常工作中會(huì)需要安裝或者卸載Python模塊.于是我整理了一下,下面這篇文章主要給大家介紹了關(guān)于python安裝/卸載模塊的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Django+zTree構(gòu)建組織架構(gòu)樹的方法

    Django+zTree構(gòu)建組織架構(gòu)樹的方法

    zTree是一個(gè)開源的依靠JQuery實(shí)現(xiàn)的多功能樹插件,具有性能優(yōu)異、配置靈活、功能強(qiáng)大的特點(diǎn),這篇文章主要介紹了Django+zTree構(gòu)建組織架構(gòu)樹,需要的朋友可以參考下
    2019-08-08
  • python如何與前端交互舉例詳解

    python如何與前端交互舉例詳解

    在Web開發(fā)中前端與后端之間的數(shù)據(jù)交互,下面這篇文章主要給大家介紹了關(guān)于python如何與前端交互的相關(guān)資料,文章通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • python如何讀取bin文件并下發(fā)串口

    python如何讀取bin文件并下發(fā)串口

    這篇文章主要介紹了python如何讀取bin文件并下發(fā)串口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python提取視頻中圖片的示例(按幀、按秒)

    Python提取視頻中圖片的示例(按幀、按秒)

    這篇文章主要介紹了Python提取視頻中圖片的示例,分別按幀和按秒提取,幫助大家利用python處理視頻,獲取素材,感興趣的朋友可以了解下
    2020-10-10
  • Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼

    Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼

    二維碼在日常生活中非常常見(jiàn),廣泛應(yīng)用于支付、登錄驗(yàn)證、信息分享等場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Python將數(shù)據(jù)生成二維碼的四種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09

最新評(píng)論

比如县| 广西| 广德县| 虎林市| 江华| 左云县| 诸城市| 望城县| 孝义市| 龙游县| 涡阳县| 诸城市| 南陵县| 长岭县| 平安县| 花垣县| 扎赉特旗| 清涧县| 五寨县| 墨江| 玉树县| 通河县| 慈利县| 榕江县| 资中县| 拉孜县| 木里| 永寿县| 新平| 江口县| 酒泉市| 康定县| 松潘县| 乳山市| 鄢陵县| 都兰县| 江华| 舞阳县| 宣威市| 凌源市| 岑溪市|