直接把參考的文章放上面吧 :這個更專業,可以直接看這個。
首先with的作用:
使用with后不管with中的代碼出現什么錯誤,都會進行對當前對象進行清理工作。
例如file的file.close()方法,無論with中出現任何錯誤,都會執行file.close()方法
其次with只有特定場合下才能使用。,這個特定場合只的是那些支持了上下文管理器的對象。
這些對象有:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
那么什么是上下文管理器:
這個管理器就是在對象內實現了兩個方法:__enter__() 和__exit__()
__enter__()方法會在with的代碼塊執行之前執行,__exit__()會在代碼塊執行結束后執行。
__exit__()方法內會自帶當前對象的清理方法。
with語句類似
try :
except:
finally:
的功能:但是with語句更簡潔。而且更安全。代碼量更少。
with 用法:
格式:
with context_expression [as target(s)]:
with-body
例子:
with open(r'somefileName') as somefile: for line in somefile: print line # ...more code
with后面為一個表達式,表達式返回的是一個上下文管理器對象,我的理解就是表達式的返回結果。使用as 可以將這個結果賦值給某個變量。方便之后操作。
一個感覺更牛掰的例子:
nested 函數:
with nested(A(), B(), C()) as (X, Y, Z): # with-body code here
等同於:
with A() as X: with B() as Y: with C() as Z: # with-body code here
直接with后面的表達式就是個方法。並且把連着三個函數的方法直接賦值給不同變量。
上下文管理器可以自定義。也可以重寫__enter__()和__exit__()方法。