Python干貨:大師兄一文教會你python with as的用法!!!

With語句是什么?

有一些任務封恰,可能事先需要設置,事后做清理工作。對于這種場景车要,Python的with語句提供了一種非常方便的處理方式司光。一個很好的例子是文件處理,你需要獲取一個文件句柄坞淮,從文件中讀取數(shù)據(jù),然后關(guān)閉文件句柄。

如果不用with語句,代碼如下:

file = open("/tmp/foo.txt")

data = file.read()

file.close()

這里有兩個問題。一是可能忘記關(guān)閉文件句柄;二是文件讀取數(shù)據(jù)發(fā)生異常,沒有進行任何處理穴豫。下面是處理異常的加強版本:

file = open("/tmp/foo.txt")try:

    data = file.read()finally:

    file.close()

雖然這段代碼運行良好,但是太冗長了筐眷。這時候就是with一展身手的時候了武翎。除了有更優(yōu)雅的語法趴捅,with還可以很好的處理上下文環(huán)境產(chǎn)生的異常。下面是with版本的代碼:

with open("/tmp/foo.txt") as file:

    data = file.read()

with如何工作迟几?

這看起來充滿魔法,但不僅僅是魔法,Python對with的處理還很聰明“撸基本思想是with所求值的對象必須有一個__enter __()方法惠啄,一個__exit __()方法姥闭。

緊跟with后面的語句被求值后廊敌,返回對象的 __enter __()方法被調(diào)用掷空,這個方法的返回值將被賦值給as后面的變量烙懦。當with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對象的__exit __()方法遵岩。

下面例子可以具體說明with如何工作:

#!/usr/bin/env python

# with_example01.py

 class Sample:

    def __enter__(self):

        print "In __enter__()"

        return "Foo"

    def __exit__(self, type, value, trace):

        print "In __exit__()"

 def get_sample():

    return Sample()

with get_sample() as sample:

    print "sample:", sample

推薦 :020 持續(xù)更新蠢熄,精品小圈子每日都有新內(nèi)容,干貨濃度極高但绕。
結(jié)實人脈、討論技術(shù) 你想要的這里都有拆座!
搶先入群,跑贏同齡人L贫稀(入群無需任何費用)
點擊此處,與Python開發(fā)大牛一起交流學習。
群號:745895701
申請即送:
Python軟件安裝包,Python實戰(zhàn)教程
資料免費領取,包括 Python基礎學習、進階學習、爬蟲、人工智能椭员、自動化運維埋同、自動化測試等

運行代碼逆甜,輸出如下

In __enter__()

sample: Foo

In __exit__()

正如你看到的集嵌,

1. __enter __()方法被執(zhí)行

2. __enter __()方法返回的值 - 這個例子中是"Foo",賦值給變量'sample'

3. 執(zhí)行代碼塊侈沪,打印變量"sample"的值為 "Foo"

4. __exit __()方法被調(diào)用

with真正強大之處是它可以處理異常应役。可能你已經(jīng)注意到Sample類的__exit __方法有三個參數(shù)- val, type 和 trace蕉陋。 這些參數(shù)在異常處理中相當有用。我們來改一下代碼仅孩,看看具體如何工作的。

#!/usr/bin/env python

# with_example02.py

 class Sample:

    def __enter__(self):

        return self

    def __exit__(self, type, value, trace):

        print "type:", type

        print "value:", value

        print "trace:", trace

    def do_something(self):

        bar = 1/0

        return bar + 10

with Sample() as sample:

    sample.do_something()

這個例子中因悲,with后面的get_sample()變成了Sample()。這沒有任何關(guān)系投放,只要緊跟with后面的語句所返回的對象有__enter __()和__exit __()方法即可拜姿。此例中壁却,Sample()的__enter __()方法返回新創(chuàng)建的Sample對象,并賦值給變量sample。

代碼執(zhí)行后:

bash-3.2$ ./with_example02.py

type: <type 'exceptions.ZeroDivisionError'>

value: integer division or modulo by zero

trace: <traceback object at 0x1004a8128>

Traceback (most recent call last):

File "./with_example02.py", line 19, in <module>

    sample.do_something()

File "./with_example02.py", line 15, in do_something

    bar = 1/0

ZeroDivisionError: integer division or modulo by zero

實際上荷辕,在with后面的代碼塊拋出任何異常時,__exit __()方法被執(zhí)行惫谤。正如例子所示,異常拋出時拯腮,與之關(guān)聯(lián)的type,value和stack trace傳給__exit __()方法哼丈,因此拋出的ZeroDivisionError異常被打印出來了车胡。開發(fā)庫時逃默,清理資源,關(guān)閉文件等等操作使兔,都可以放在__exit __方法當中泽艘。

因此喜每,Python的with語句是提供一個有效的機制刚照,讓代碼更簡練繁莹,同時在異常產(chǎn)生時薄风,清理工作更簡單茄猫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市命咐,隨后出現(xiàn)的幾起案子钝域,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡慢蜓,警方通過查閱死者的電腦和手機耘柱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱鞠,“玉大人阳掐,你說我怎么就攤上這事蛉拙』粒” “怎么了大咱?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵煮仇,是天一觀的道長间景。 經(jīng)常有香客問我,道長曹铃,這世上最難降的妖魔是什么灰粮? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趁猴。我一直安慰自己酵镜,他們只是感情好缸濒,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布氮帐。 她就那樣靜靜地躺著,像睡著了一般两入。 火紅的嫁衣襯著肌膚如雪刁岸。 梳的紋絲不亂的頭發(fā)上矾踱,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音某宪,去河邊找鬼瞻想。 笑死贵少,一個胖子當著我的面吹牛滔灶,可吹牛的內(nèi)容都是我干的缀皱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼叛赚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了璃哟?” 一聲冷哼從身側(cè)響起喊递,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤户矢,失蹤者是張志新(化名)和其女友劉穎梯浪,沒想到半個月后延窜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體获高,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年秕重,在試婚紗的時候發(fā)現(xiàn)自己被綠了菱魔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留荔。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖聚蝶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碘勉,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布验靡,位于F島的核電站,受9級特大地震影響胜嗓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辞州,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望变过。 院中可真熱鬧,春花似錦媚狰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裳瘪。三九已至罪针,卻和暖如春彭羹,著一層夾襖步出監(jiān)牢的瞬間泪酱,已是汗流浹背派殷。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工墓阀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斯撮。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像勿锅,于是被迫代替她去往敵國和親枣氧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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