1. 程式人生 > >Python的with...as...語句

Python的with...as...語句

Python的with...as的用法

這個語法是用來代替傳統的try...finally語法的。 

with EXPRESSION [ as VARIABLE] WITH-BLOCK 

基本思想是with所求值的物件必須有一個__enter__()方法,一個__exit__()方法。

緊跟with後面的語句被求值後,返回物件的__enter__()方法被呼叫,這個方法的返回值將被賦值給as後面的變數。當with後面的程式碼塊全部被執行完之後,將呼叫前面返回物件的__exit__()方法。

例子:

f = open("D://report_data2.txt")
try:
    data = f.read()
except:
    print("讀取檔案失敗!")
else:
    print(data)
finally:
    f.close()
# with...as...
with open("D://report_data2.txt") as f:
    data = f.read()
print(data)
使用with...as...的方式替換,修改後的程式碼是:
with open("D://report_data2.txt") as f:
    data = f.read()
print(data)

進一步說明:

class Sample:
    def __enter__(self):
        print("__enter__()")
        return 1111111111

    def __exit__(self, type, value, trace):
        print("__exit__()")

# 例項化
with Sample() as s:
    print(type(s))
    print("sample:", s)
執行結果為
__enter__()
<class 'int'>
sample: 1111111111

__exit__()

說明:

1. __enter__()方法被執行

2. __enter__()方法返回的值 - 這個例子中是int  1111111111,賦值給s變數

3. 執行程式碼塊,列印變數s的值為 11111111

4. __exit__()方法被呼叫with真正強大之處是它可以處理異常。可能你已經注意到Sample類的__exit__方法有三個引數- val, type 和 trace。這些引數在異常處理中相當有用。

收藏:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/