python 上下文管理

簡(jiǎn)介

????????上下文管理屬于流程控制特性中一部分张症,在python中仓技,上下文管理語(yǔ)法主要是使用with關(guān)鍵詞。with語(yǔ)句會(huì)設(shè)置一個(gè)臨時(shí)的上下文俗他,對(duì)對(duì)象進(jìn)行控制脖捻,并且清除上下文,這樣做的好處是能夠減少錯(cuò)誤兆衅,使得代碼整潔易讀地沮。我們?cè)敿?xì)分析下流程控制的else,和上下文管理羡亩。

else字句

????????當(dāng)然摩疑,else是我們經(jīng)常用的關(guān)鍵詞,相信大家大部分都是使用于if-else對(duì)畏铆。其實(shí)在python中雷袋,還有其他情況能使用else字句,當(dāng)然都屬于流程控制的范濤辞居。如for/else楷怒、while/else 和 try/else。

  • for/else對(duì)中else瓦灶,當(dāng)且僅當(dāng)for循環(huán)運(yùn)行完畢時(shí)鸠删,也就是所有元素都遍歷,不能中斷贼陶,else才會(huì)執(zhí)行
for i in range(10):
    pass
else:
    print("---else----")
輸出結(jié)果:
---else----

當(dāng)for循環(huán)中有break時(shí)刃泡,else字句不會(huì)執(zhí)行:

for i in range(10):
    if i == 7:
        break
else:
    print("---else----")
  • while/else句子中,當(dāng)while循環(huán)因條件不滿足而退出循環(huán)時(shí)碉怔,也就是沒(méi)有break中斷捅僵,else會(huì)被執(zhí)行:
flag = 5
while flag:
    flag -= 1
else:
    print("---else----")
輸出結(jié)果:
---else----
  • try/else,當(dāng)try語(yǔ)句沒(méi)有拋出異常時(shí),會(huì)執(zhí)行else字句眨层。

其實(shí)else在上述語(yǔ)句中不是很常用庙楚,但是也是有些情況使用會(huì)很方便的,例如:

for i in range(10):
    if i == 12:
        break
else:
    print("列表中沒(méi)有12")

上述情況下趴樱,使用else之后馒闷,無(wú)需設(shè)置控制標(biāo)志或者額外的if語(yǔ)句酪捡,如果不使用else∧烧耍恐怕要像下面這種寫法了:

flag = 0
for i in range(10):
    if i == 12:
        flag = 1
        break
if flag:
    pass
else:
    print("列表中沒(méi)有12")

可見逛薇,有些時(shí)候在for循環(huán)使用else,也能省去很多麻煩的疏虫。

with語(yǔ)句

????????上下文管理器對(duì)象存在的目的是管理with語(yǔ)句永罚,with語(yǔ)句的目的是簡(jiǎn)化try/finally 模式。用于保證一段代碼執(zhí)行后進(jìn)行某些操作卧秘,即使拋出異常也會(huì)執(zhí)行收尾工作呢袱。
????????上下文管理器主要包含兩個(gè)特殊方法,__enter____exit__,with開始時(shí)翅敌,會(huì)調(diào)用上下文管理器對(duì)象的__enter__方法羞福,with結(jié)束后,會(huì)調(diào)用__exit__方法蚯涮。
????????最常見的with語(yǔ)句是文件打開治专,確保最后文件能夠關(guān)閉:

with open("test.txt") as f:
    pass

f綁定到打開的文件上面,是調(diào)用上下文管理器對(duì)象的__enter__方法的結(jié)果遭顶。無(wú)論這個(gè)流程語(yǔ)句以何種情況結(jié)束张峰,最后都會(huì)調(diào)用__exit__方法。
如下棒旗,定義一個(gè)簡(jiǎn)單的上下文管理器對(duì)象:

class Test(object):
    def __enter__(self):
        print("enter")

    def __exit__(self, exc_type, exc_value, traceback):
        print("exit")
        print(exc_type, exc_value, traceback)

with Test():
    pass
輸出結(jié)果:
enter
exit
None None None

若有異常:

class Test(object):
    def __enter__(self):
        print("enter")

    def __exit__(self, exc_type, exc_value, traceback):
        print("exit",exc_type, exc_value, traceback,"exit")

with Test():
    a
輸出結(jié)果:
enter
exit <class 'NameError'> name 'a' is not defined <traceback object at 0x000001A421F68708> exit
Traceback (most recent call last):
  File "c:/Users/DELL/Desktop/ssj/search/descrip.py", line 12, in <module>
    a
NameError: name 'a' is not defined

調(diào)用方法__enter__時(shí)挟炬,除了self,不會(huì)傳其他參數(shù)的嗦哆。
調(diào)用__exit__方法時(shí):
沒(méi)有異常發(fā)生時(shí)谤祖,除了self,傳的三個(gè)參數(shù)都是None老速;
有異常情況時(shí)粥喜,三個(gè)參數(shù)的意義:
exc_type:異常類
exc_value:異常消息
traceback:traceback對(duì)象。
上下文管理器標(biāo)準(zhǔn)庫(kù)中也有很多用法:
比如django數(shù)據(jù)庫(kù)中的事務(wù):

 with transaction.atomic():
    pass

threading 多線程中的鎖:

whit threading.Lock():
    pass

????????其實(shí)關(guān)于上下文管理器橘券,有一個(gè)專門的內(nèi)置庫(kù)contextlib
這個(gè)模塊提供了一個(gè)很實(shí)用的工具@contextmanager额湘,這個(gè)裝飾器能把生成器函數(shù)變成上下文管理器,

from contextlib import contextmanager

@contextmanager
def test():
    print("enter")
    yield "aaaa"
    print("exit")

with test() as f:
    pass
print(f)
輸出結(jié)果:
enter
exit
aaaa

在使用@contextmanager裝飾的生成器中旁舰,yield語(yǔ)句把上下分成兩個(gè)部分锋华,yield以上,是在with執(zhí)行時(shí)箭窜,也就是調(diào)用方法__enter__時(shí)毯焕,yield下面的代碼在調(diào)用__exit__方法時(shí)執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纳猫,隨后出現(xiàn)的幾起案子婆咸,更是在濱河造成了極大的恐慌,老刑警劉巖芜辕,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尚骄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侵续,警方通過(guò)查閱死者的電腦和手機(jī)倔丈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)状蜗,“玉大人需五,你說(shuō)我怎么就攤上這事∈ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵训裆,是天一觀的道長(zhǎng)眶根。 經(jīng)常有香客問(wèn)我,道長(zhǎng)边琉,這世上最難降的妖魔是什么属百? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮变姨,結(jié)果婚禮上族扰,老公的妹妹穿的比我還像新娘。我一直安慰自己定欧,他們只是感情好渔呵,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砍鸠,像睡著了一般扩氢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爷辱,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天录豺,我揣著相機(jī)與錄音,去河邊找鬼饭弓。 笑死双饥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弟断。 我是一名探鬼主播咏花,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阀趴!你這毒婦竟也來(lái)了迟螺?” 一聲冷哼從身側(cè)響起冲秽,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矩父,沒(méi)想到半個(gè)月后锉桑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窍株,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年民轴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球订。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡后裸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冒滩,到底是詐尸還是另有隱情微驶,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布开睡,位于F島的核電站因苹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篇恒。R本人自食惡果不足惜扶檐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胁艰。 院中可真熱鬧款筑,春花似錦、人聲如沸腾么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)解虱。三九已至颈嚼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饭寺,已是汗流浹背阻课。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艰匙,地道東北人限煞。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像员凝,于是被迫代替她去往敵國(guó)和親署驻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 首先,什么是上下文管理器旺上?上下文管理器就是實(shí)現(xiàn)了上下文管理協(xié)議的對(duì)象瓶蚂。主要用于保存和恢復(fù)各種全局狀態(tài),關(guān)閉文件等宣吱,...
    王吉吉real閱讀 12,728評(píng)論 0 6
  • 上下文管理器最常用的是確保正確關(guān)閉文件窃这, with 語(yǔ)句的基本語(yǔ)法, expression是一個(gè)上下文管理器征候,其實(shí)...
    茍雨閱讀 795評(píng)論 0 1
  • 什么是上下文管理器 上下文管理器顧名思義是管理上下文的,也就是負(fù)責(zé)沖鋒和墊后,而讓主人專心完成自己的事情杭攻。我們?cè)诰?..
    派派森森閱讀 431評(píng)論 0 4
  • 上下文管理器 概念:實(shí)現(xiàn)了上下文協(xié)議的對(duì)象即為上下文管理器兆解。 上下文管理器的協(xié)議: __enter__進(jìn)入的方法_...
    Alcazar閱讀 745評(píng)論 0 4
  • 在最近與讀者朋友們的互動(dòng)交流中锅睛,關(guān)于人際關(guān)系的困惑這方面,我發(fā)現(xiàn)一些朋友總會(huì)為了迎合某些“聰明”的群體而甘愿吃虧受...
    袁大島閱讀 500評(píng)論 1 0