日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python with as 的實現(xiàn)原理

系統(tǒng) 1690 0

有一些任務(wù),可能事先需要設(shè)置,事后做清理工作。對于這種場景,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

            
          

運行代碼,輸出如下

            
              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ù)在異常處理中相當有用。我們來改一下代碼,看看具體如何工作的。


作者:龍皓晨
鏈接:https://www.jianshu.com/p/1a02a5b63c88
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 合肥市| 新兴县| 专栏| 象州县| 高淳县| 高青县| 句容市| 萝北县| 乌海市| 柳州市| 乌鲁木齐市| 大同市| 台南市| 宁海县| 延寿县| 逊克县| 永新县| 临颍县| 木兰县| 志丹县| 江安县| 武汉市| 中超| 淮北市| 义马市| 离岛区| 新疆| 泽普县| 海伦市| 连江县| 呈贡县| 平罗县| 唐河县| 如东县| 彰武县| 什邡市| 泌阳县| 哈巴河县| 栖霞市| 蕉岭县| 贡嘎县|