python的with關鍵字

前言

with表達式其實是try-finally的簡寫形式。但是又不是全相同。

格式

"""
格式
with context [as var]:
    pass
"""

其中的context是一個表達式,返回的是一個對象,var用來保存context表達式返回的對象,可以有單個或者多個返回值。

with open('1.txt') as f:
    print(f.read())
    
print(f.closed)

表達式open('1.txt')返回是一個_io.TextIOWrapper 類型的變量用f接受到。在with語句塊中就可以使用這個變量操作文件。執行with這個結構之後。f會自動關閉。相當於自帶了一個finally。

但是with本身並沒有異常捕獲的功能,但是如果發生了運行時異常,它照樣可以關閉文件釋放資源。

這個例子可以看出with沒有捕獲異常的功能

with open('2.txt') as f:
    print(f.read())
    
print(f.closed)

這個例子可以看出with發生了異常也會關閉程序。

try:
    with open('1.txt') as f2:
        print(f2.read())
        f2.seek(-5,os.SEEK_SET)
except ValueError as e:
    print("error")
    print(f2.closed)

原理

"""
with 語句實質是上下文管理。
1、上下文管理協議。包含方法__enter__() 和 __exit__(),支持該協議對象要實現這兩個方法。
2、上下文管理器,定義執行with語句時要建立的運行時上下文,負責執行with語句塊上下文中的進入與退出操作。
3、進入上下文的時候執行__enter__方法,如果設置as var語句,var變量接受__enter__()方法返回值。
4、如果運行時發生了異常,就退出上下文管理器。調用管理器__exit__方法。
"""

應用場景

1、文件操作。2、進程線程之間互斥對象。3、支持上下文其他對象

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章