国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 的 with 語句詳解

2020-02-23 05:29:18
字體:
供稿:網(wǎng)友

一、簡介

with是從Python 2.5 引入的一個新的語法,更準(zhǔn)確的說,是一種上下文的管理協(xié)議,用于簡化try…except…finally的處理流程。with通過__enter__方法初始化,然后在__exit__中做善后以及處理異常。對于一些需要預(yù)先設(shè)置,事后要清理的一些任務(wù),with提供了一種非常方便的表達(dá)。

with的基本語法如下,EXPR是一個任意表達(dá)式,VAR是一個單一的變量(可以是tuple),”as VAR”是可選的。
代碼如下:
with EXPR as VAR:
    BLOCK
根據(jù)PEP 343的解釋,with…as…會被翻譯成以下語句:
代碼如下:
mgr = (EXPR)
exit = type(mgr).__exit__  # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
    try:
        VAR = value  # Only if "as VAR" is present
        BLOCK
    except:
        # The exceptional case is handled here
        exc = False
        if not exit(mgr, *sys.exc_info()):
            raise
        # The exception is swallowed if exit() returns true
finally:
    # The normal and non-local-goto cases are handled here
    if exc:
        exit(mgr, None, None, None)
為什么這么復(fù)雜呢?注意finally中的代碼,需要BLOCK被執(zhí)行后才會執(zhí)行finally的清理工作,因為當(dāng)EXPR執(zhí)行時拋出異常,訪問mgr.exit執(zhí)行就會報AttributeError的錯誤。


二、實現(xiàn)方式

根據(jù)前面對with的翻譯可以看到,被with求值的對象必須有一個__enter__方法和一個__exit__方法。稍微看一個文件讀取的例子吧,注意在這里我們要解決2個問題:文件讀取異常,讀取完畢后關(guān)閉文件句柄。用try…except一般會這樣寫:
代碼如下:
f = open('/tmp/tmp.txt')
try:
    for line in f.readlines():
        print(line)
finally:
    f.close()
注意我們這里沒有處理文件打開失敗的IOError,上面的寫法可以正常工作,但是對于每個打開的文件,我們都要手動關(guān)閉文件句柄。如果要使用with來實現(xiàn)上述功能,需要需要一個代理類:
代碼如下:
class opened(object):

    def __init__(self, name):
        self.handle = open(name)

    def __enter__(self):
        return self.handle

    def __exit__(self, type, value, trackback):
        self.handle.close()

with opened('/tmp/a.txt') as f:
    for line in f.readlines():

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 府谷县| 万山特区| 高碑店市| 乌什县| 肥东县| 上饶县| 章丘市| 恩施市| 广宗县| 林口县| 松滋市| 阿坝| 健康| 马龙县| 玉林市| 宜阳县| 张家港市| 莱州市| 深水埗区| 开封县| 昆明市| 高碑店市| 慈利县| 延川县| 阳曲县| 芮城县| 灵寿县| 启东市| 河源市| 泸定县| 通江县| 海阳市| 海原县| 论坛| 通城县| 信丰县| 汤阴县| 湖州市| 定结县| 穆棱市| 雷山县|