python with as 的用法
阿新 • • 發佈:2018-03-06
final clas 上下文 執行 try __exit__ tmp bsp data
with語句:
事後做清理工作。比如文件處理,需要獲取一個文件句柄,從文件中讀取數據,然後關閉文件句柄
不用with語句,代碼如下:
file = open("/tmp/foo.txt") data = file.read() file.close()
這裏有兩個問題。一是忘記關閉文件句柄;二是文件讀取數據發生異常,沒進行任何處理。下面是處理異常的加強版:
file = open("/tmp/foo.txt") try: data = file.read() finally: file.close()
這段代碼運行良好,但是太冗長。
with可以處理上下文環境產生的異常,代碼如下:
with open ("/tmp/foo.txt") as file: data = file.read()
with如何工作:
基本思想是with所求值的對象必須有一個__enter__()方法,一個__exit()__方法。
緊跟with後面的語句被求值後,返回對象的__enter__()方法被調用,這個方法的返回值被賦值給as後面的變量。當with後面的代碼塊全部被執行完之後,將調用前面返回對象的__exit()__方法。
class Sample: def __enter__(self): print("In __enter__()")return "Foo" def __exit__(self, type, value, trace): print("In __exit__()") def get_sample(): return Sample() with get_sample() as sample: print("sample:", sample)
正如你看到的:
1.__enter__()方法被執行
2.__enter__()方法返回的值---例子中是"Foo",賦值給變量“sample”
3.執行代碼塊,打印變量“sample”的值為"Foo"
4.__exit__()方法被調用
with真正強大之處是它可以處理異常。可能你已經註意到Sample類的__exit__方法有三個參數val, type, trace。這些參數在處理異常中非常有用。下面改一下代碼,看看具體如何工作。
class Sample: def __enter__(self): return self def __exit__(self, type, value, trace): print("type")
python with as 的用法