我想了解Python中的語句。我到處看到它打開和關閉一個文件的談話,並且意味着替換try-finally塊。有人可以發佈一些其他的例子。我只是嘗試了燒瓶,並有聲明在其中。絕對要求某人提供一些清晰的信息。Python「with」語句用於什麼?
4
A
回答
9
有一個非常好的解釋here。基本上,with語句在關聯對象上調用兩個特殊方法。 __enter__和__exit__方法。 enter方法返回與「with」語句關聯的變量。雖然__exit__方法在執行語句以處理任何清理(例如關閉文件指針)後被調用。
9
with
陳述的想法是讓「做正確的事」成爲阻力最小的路徑。雖然文件的例子是最簡單的,線程鎖實際提供的無明顯缺陷代碼比較經典的例子:
try:
lock.acquire()
# do stuff
finally:
lock.release()
該代碼被打破 - 如果鎖定獲取以往任何時候都失敗了,要麼有錯誤,會引發異常(因爲代碼會嘗試釋放它從未獲取的鎖),或者更糟的是,如果這是一個遞歸鎖,它將會提前發佈。正確的代碼如下所示:
lock.acquire()
try:
# do stuff
finally:
# If lock.acquire() fails, this *doesn't* run
lock.release()
通過使用with
聲明,就不可能得到這個錯誤的,因爲它是建立在上下文管理器:
with lock: # The lock *knows* how to correctly handle acquisition and release
# do stuff
其他地方,with
語句非常類似於函數和類裝飾器的主要好處:它需要「兩件式」代碼,可以用任意數量的代碼行分開(裝飾器的函數定義,當前案例中的try
塊)並將其轉化爲程序員si所在的「單件」代碼mply宣稱他們正在嘗試做什麼。
對於簡短的例子,這看起來不像是一個大的收穫,但它實際上在審查代碼時會產生巨大的差異。當我在一段代碼中看到lock.acquire()
時,我需要向下滾動並檢查相應的lock.release()
。當我看到with lock:
,但是,不需要這樣的檢查 - 我可以立即看到鎖將被正確釋放。
1
有在PEP343使用with
,包括文件打開示例12個示例:
- 一種用於確保一個鎖,在 塊的開始獲得的,是當該塊是釋放的模板左
- 一種用於開口確保所述文件的文件模板被關閉 當塊被左
- 一種用於提交或回滾數據庫 交易 模板
- 實施例1改寫而不發電機
- 重定向標準輸出暫時
- 上打開()也將返回錯誤條件
- 另一個有用的實施例將是一個操作的變體,其塊 信號
- 另一種用途爲這個特點是小數情況下
- 下面是小數模塊
- 一個通用的「對象閉」上下文管理簡單上下文管理
- 通過交換acquire()和release()調用,釋放()上下文以臨時釋放先前獲取的鎖。
- 「嵌套」上下文管理器,自動從左到右嵌套 提供的上下文以避免過多 縮進
相關問題
- 1. 在Python with語句使用
- 2. Python with「with」語句的語法無效
- 3. 在Python中使用'with .. as'語句有什麼好處?
- 4. 」with「在Python中的語句
- 5. python「with」語句是爲什麼設計的?
- 6. 定義一個類似於Python「with」語句的C宏有什麼缺點?
- 7. Object with Combobox with With語句
- 8. 關於在Python中使用with語句的技巧
- 9. 在「With」語句中使用「IF」語句
- 10. with語句
- 11. 什麼是同步語句用於?
- 12. 爲什麼我的IF語句不適用於python?
- 13. 在Python中嵌套'WITH'語句
- 14. 」with「在Python中的語句__exit__
- 15. 在Python代碼中替換「with」語句
- 16. SQLite的光標在Python with語句
- 17. 分配使用with語句
- 18. 問題使用with語句
- 19. SQL「WITH」子句/語句
- 20. verilog with cocotb:assign語句
- 21. RegularExpressionValidator with Or語句
- 22. WITH語句在PostgreSQL
- 23. 這個Python語句是什麼意思?
- 24. 爲什麼Python在try語句中沒有實現elif語句?
- 25. 爲什麼這個python if語句不等於true?
- 26. Python的pass語句在PHP中等效於什麼?
- 27. 這對於require語句做了什麼?
- 28. 什麼是調用語句
- 29. 爲什麼UPDATE語句適用於initWithFormat而不適用於stringWithFormat?
- 30. 爲什麼上下文在with語句後四處停留?
我與OP。您給出的鏈接演示了Alice描述的「打開和關閉文件」示例,但它實際上並未顯示*爲什麼*它比「data = open(」x.txt「)。read()」更好。看起來「有了」是我應該考慮的事情,但如果我能說出它的實際效果,我就會感到厭煩。 – 2010-09-28 19:24:13
使用它來避免在完成某些事情後不得不記住或處理任何清理的關鍵原因。 with block爲你做到了這一點。因此,而不是fp = open()... fp.close()。你只是使用一個塊。 – GWW 2010-09-28 20:33:17
但這裏有什麼大不了的。終於嘗試塊更清晰,更清晰,如下所述:顯式比隱式更好! :-) – Rasmus 2010-09-29 02:38:11