with使用,預先處理與事后處理

with語句常用來處理一些事務的事先處理與事后清理工作。像文件處理時要先取得文件句柄,處理完后要關閉文件句柄

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

這里沒有對讀取數據發生的異常作任何處理,而且容易忘記把文件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()

這段代碼雖然運行良好,但是太冗長了。下面使用with優雅地實現文件操作

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

這里with會自動處理文件關閉操作。這里沒有對打開文件異常作處理,數據讀取異的處理是文件對象中定義的,因為是C寫的模塊,不知道實際處理情況。實際使用時候用try except外層處理一次應該就夠了

自定義with處理對象

定義一個對象并實現enter()與exit()方法,分別進行預處理與后處理。enter()返回一個任意對象給as使用

class Tes:
    def __enter__(self):
        print('in enter')
        # raise ValueError('enter error')   # 這里的異常會直接退出,不會執行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時 with block的ValueError異常會被攔截, 程序會正常執行

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

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

with多個對象

with open('1.txt') as f1, open('2.txt') as f2:
    # do something with f1, f2
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,432評論 25 708
  • 轉載自:http://mp.weixin.qq.com/s/LO1yyFeUA6pR_YPyfDoSig 姓名:梅...
    虐先森閱讀 1,452評論 0 1
  • 都說感情要靠緣分,嗯沒錯事實也是要如此。
    伊家閱讀 132評論 1 0
  • 文/安若木槿 對我而言,寫作意味著什么? 自有意識以來,這個問題便始終伴隨著我的寫作之旅。問題的答案時而清晰時而模...
    蜉蝣舟閱讀 904評論 6 6