python的with關鍵字

前言

with表達式其實是try-finally的簡寫形式。但是又不是全相同。

格式

"""
格式
with context [as var]:
    pass
"""

其中的context是一個表達式桑腮,返回的是一個對象洽损,var用來保存context表達式返回的對象,可以有單個或者多個返回值张抄。

with open('1.txt') as f:
    print(f.read())
    
print(f.closed)

表達式open('1.txt')返回是一個_io.TextIOWrapper 類型的變量用f接受到砂蔽。在with語句塊中就可以使用這個變量操作文件。執(zhí)行with這個結(jié)構之后署惯。f會自動關閉左驾。相當于自帶了一個finally。


image.png

但是with本身并沒有異常捕獲的功能极谊,但是如果發(fā)生了運行時異常诡右,它照樣可以關閉文件釋放資源。

這個例子可以看出with沒有捕獲異常的功能轻猖。

with open('2.txt') as f:
    print(f.read())
    
print(f.closed)
image.png

這個例子可以看出with發(fā)生了異常也會關閉程序帆吻。

try:
    with open('1.txt') as f2:
        print(f2.read())
        f2.seek(-5,os.SEEK_SET)
except ValueError as e:
    print("error")
    print(f2.closed)

image.png

原理

"""
with 語句實質(zhì)是上下文管理。
1咙边、上下文管理協(xié)議猜煮。包含方法__enter__() 和 __exit__(),支持該協(xié)議對象要實現(xiàn)這兩個方法败许。
2友瘤、上下文管理器,定義執(zhí)行with語句時要建立的運行時上下文檐束,負責執(zhí)行with語句塊上下文中的進入與退出操作辫秧。
3、進入上下文的時候執(zhí)行__enter__方法被丧,如果設置as var語句盟戏,var變量接受__enter__()方法返回值。
4甥桂、如果運行時發(fā)生了異常柿究,就退出上下文管理器。調(diào)用管理器__exit__方法黄选。
"""

自定義類

自定義類必須包含上述幾個方法才能正確使用with關鍵字蝇摸。

class Mycontex(object):
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print("進入enter")
        return self
    def do_self(self):
        print(self.name)
    def __exit__(self,exc_type,exc_value,traceback):
        print("退出exit")
        print(exc_type,exc_value)
if __name__ == '__main__':
    with Mycontex('test') as mc:
        mc.do_self()
image.png

下面我們故意加一個NameError


image.png

即使程序發(fā)生了錯誤婶肩,python解釋器終止了我們的程序,但是我們的類 還是順利關閉了貌夕。

應用場景

1律歼、文件操作。2啡专、進程線程之間互斥對象险毁。3、支持上下文其他對象

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们童,一起剝皮案震驚了整個濱河市畔况,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慧库,老刑警劉巖跷跪,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齐板,居然都是意外死亡域庇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門覆积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听皿,“玉大人,你說我怎么就攤上這事宽档∥疽蹋” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵吗冤,是天一觀的道長又厉。 經(jīng)常有香客問我,道長椎瘟,這世上最難降的妖魔是什么覆致? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肺蔚,結(jié)果婚禮上煌妈,老公的妹妹穿的比我還像新娘。我一直安慰自己宣羊,他們只是感情好璧诵,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仇冯,像睡著了一般之宿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苛坚,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天比被,我揣著相機與錄音色难,去河邊找鬼。 笑死等缀,一個胖子當著我的面吹牛枷莉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播项滑,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涯贞!你這毒婦竟也來了枪狂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤宋渔,失蹤者是張志新(化名)和其女友劉穎州疾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皇拣,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡严蓖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氧急。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颗胡。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吩坝,靈堂內(nèi)的尸體忽然破棺而出毒姨,到底是詐尸還是另有隱情,我是刑警寧澤钉寝,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布弧呐,位于F島的核電站,受9級特大地震影響嵌纲,放射性物質(zhì)發(fā)生泄漏俘枫。R本人自食惡果不足惜逮走,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一鸠蚪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师溅,春花似錦、人聲如沸险胰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棚贾。三九已至窖维,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妙痹,已是汗流浹背铸史。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怯伊,地道東北人琳轿。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像耿芹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧秕,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理琉闪,服務發(fā)現(xiàn),斷路器颠毙,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法砂碉,內(nèi)部類的語法蛀蜜,繼承相關的語法,異常的語法增蹭,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 轉(zhuǎn)載自:http://mp.weixin.qq.com/s/LO1yyFeUA6pR_YPyfDoSig 姓名:梅...
    虐先森閱讀 1,418評論 0 1
  • contextlib — Context Manager Utilities contextlib - 上下文管理...
    英武閱讀 2,705評論 0 52
  • 承諾 幾許空白 斷腸天涯依舊在 三寸愁 會曉時分 夢醒之處 魂已留 早注定 天高地厚 有心不懼力乏 紅絲布 淚噙眶...
    禾小沫閱讀 263評論 0 2