2010-04-29 28 views
18
 
with open("hello.txt", "wb") as f: 
    f.write("Hello Python!\n") 

似乎是一樣在Python中使用'with .. as'語句有什麼好處?

f = open("hello.txt", "wb") 
f.write("Hello Python!\n") 
f.close() 

什麼是採用開放的優勢。作爲代替F =? 它只是語法糖?只保存一行代碼?

+1

http://effbot.org/zone/python-with-statement.htm – 2010-04-29 15:03:00

+0

更多有用的關於RAII的閱讀http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization – wescpy 2010-04-29 18:13:38

回答

25

時,爲了等同於with報表版本,你寫的代碼看起來應該不是這樣的代碼更乾淨:

f = open("hello.txt", "wb") 
try: 
    f.write("Hello Python!\n") 
finally: 
    f.close() 

雖然這看起來像語法糖,它確保您釋放資源。通常情況下,這個世界比這些人爲的例子更復雜,如果你忘記了一個try.. except...或者無法處理極端情況,那麼你的資源泄漏就在你手上。

with語句將您從這些泄漏中解脫出來,從而更易於編寫乾淨的代碼。有完整的解釋,請看PEP 343,它有很多例子。

+0

它是'except',而不是'catch' – SilentGhost 2010-04-29 15:15:31

+0

@SilentGhost:謝謝。 – 2010-04-29 16:10:40

+1

@SilentGhost:很好。 – 2012-10-18 07:01:59

3

如果在f.write()期間發生異常,前者仍然關閉f

13

如果f.write拋出一個異常,當您使用withf.close()被調用,並在第二種情況下不會被調用。此外f有一個較小的範圍和使用with.