python 中 with的用法

with 語句使用于對資源進(jìn)行訪問的場合,確保不管使用過程是否發(fā)生異常都會執(zhí)行必要的"清理"操作,釋放資源,比如文件使用后自動關(guān)閉/線程中鎖的自動獲取和釋放

with open("1.txt") as file:
    data = file.read()

使用with,能夠減少冗長,還能自動處理上下文環(huán)境產(chǎn)生的異常

with 工作原理
(1)緊跟with后面的語句被求值后,返回對象的__enter__()方法被調(diào)用,這個方法的返回值將被賦值給as后面的變量;
(2)當(dāng)with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對象的__exit__()方法。
with工作原理代碼示例:

class Sample:
    def __enter__(self):
        print("進(jìn)入 with")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出 with")

    def xxx(self):
        print('讀取文件')


with Sample() as sample:
    print("__enter__的返回值: ", sample)
    sample.xxx()

結(jié)果
  進(jìn)入 with
  __enter__的返回值:  <__main__.Sample object at 0x000001B6C33977F0>
  讀取文件
  退出 with

可以看到,整個運行過程如下:
(1)__enter__()方法被執(zhí)行;
(2)__enter__()方法的返回值,在這個例子中是self,賦值給變量sample;
(3)執(zhí)行代碼塊,__enter__的返回值: <__main__.Sample object at 0x000001B6C33977F0>;
( 4 )執(zhí)行方法 xxx()
( 5 )__exit__()方法被調(diào)用;

【注:】exit()方法中有3個參數(shù), exc_type, exc_val, exc_tb,這些參數(shù)在異常處理中相當(dāng)有用。
exc_type: 錯誤的類型
exc_val: 錯誤類型對應(yīng)的值
exc_tb: 代碼中錯誤發(fā)生的位置

總結(jié)

實際上,在with后面的代碼塊拋出異常時,exit()方法被執(zhí)行。開發(fā)庫時,清理資源,關(guān)閉文件等操作,都可以放在exit()方法中。
總之,with-as表達(dá)式極大的簡化了每次寫finally的工作,這對代碼的優(yōu)雅性是有極大幫助的。
如果有多項,可以這樣寫:

With open('1.txt') as f1, open('2.txt') as  f2:
    do something
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:http://mp.weixin.qq.com/s/LO1yyFeUA6pR_YPyfDoSig 姓名:梅...
    虐先森閱讀 1,486評論 0 1
  • 第一次遇到with是在文件那一章,with的作用是就是會自動關(guān)掉文件管道。 這一部分就等價于 第二次是在數(shù)據(jù)庫連接...
    lattle閱讀 11,328評論 0 4
  • 引言 with 語句是從 Python 2.5 開始引入的一種與異常處理相關(guān)的功能(2.5 版本中要通過 from...
    氨基鈉閱讀 428評論 0 2
  • contextlib — Context Manager Utilities contextlib - 上下文管理...
    英武閱讀 2,987評論 0 52
  • 本文轉(zhuǎn)自淺談Python的with語句 引言 with 語句是從 Python 2.5 開始引入的一種與異常處理相...
    Syfun閱讀 4,071評論 0 50

友情鏈接更多精彩內(nèi)容