with使用,預(yù)先處理與事后處理

with語(yǔ)句常用來(lái)處理一些事務(wù)的事先處理與事后清理工作。像文件處理時(shí)要先取得文件句柄,處理完后要關(guān)閉文件句柄

file = open('tes.txt')
data = file.read()
file.close()

這里沒(méi)有對(duì)讀取數(shù)據(jù)發(fā)生的異常作任何處理,而且容易忘記把文件close掉。下面代碼添加異常處理

try:
    file = open('tes.txt')
except:
    print('fail to open')

try:
    data = file.read()
    # do something
except:
    print('read err')
    # do something
finally:
    file.close()

這段代碼雖然運(yùn)行良好,但是太冗長(zhǎng)了。下面使用with優(yōu)雅地實(shí)現(xiàn)文件操作

with open('tes.txt') as file:
    data = file.read()
    # do something

這里with會(huì)自動(dòng)處理文件關(guān)閉操作。這里沒(méi)有對(duì)打開(kāi)文件異常作處理,數(shù)據(jù)讀取異的處理是文件對(duì)象中定義的,因?yàn)槭荂寫的模塊,不知道實(shí)際處理情況。實(shí)際使用時(shí)候用try except外層處理一次應(yīng)該就夠了

自定義with處理對(duì)象

定義一個(gè)對(duì)象并實(shí)現(xiàn)enter()與exit()方法,分別進(jìn)行預(yù)處理與后處理。enter()返回一個(gè)任意對(duì)象給as使用

class Tes:
    def __enter__(self):
        print('in enter')
        # raise ValueError('enter error')   # 這里的異常會(huì)直接退出,不會(huì)執(zhí)行with block與__exit__()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('in exit')
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        if exc_type is ValueError:
            return True  #返回ture時(shí) with block的ValueError異常會(huì)被攔截, 程序會(huì)正常執(zhí)行

    # 這個(gè)不是必需的
    def dosomething(self):
        print('do something')

with Tes() as t:
    t.dosomething()
    raise ValueError('block error')
  
## 運(yùn)行結(jié)果  
# in enter
# do something
# in exit
# <class 'ValueError'>
# block error
# <traceback object at 0x102a255c8>

with多個(gè)對(duì)象

with open('1.txt') as f1, open('2.txt') as f2:
    # do something with f1, f2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,979評(píng)論 25 709
  • 轉(zhuǎn)載自:http://mp.weixin.qq.com/s/LO1yyFeUA6pR_YPyfDoSig 姓名:梅...
    虐先森閱讀 1,487評(píng)論 0 1
  • 都說(shuō)感情要靠緣分,嗯沒(méi)錯(cuò)事實(shí)也是要如此。
    伊家閱讀 151評(píng)論 1 0
  • 文/安若木槿 對(duì)我而言,寫作意味著什么? 自有意識(shí)以來(lái),這個(gè)問(wèn)題便始終伴隨著我的寫作之旅。問(wèn)題的答案時(shí)而清晰時(shí)而模...
    蜉蝣舟閱讀 958評(píng)論 6 6

友情鏈接更多精彩內(nèi)容