[英]How to use a context manager in python
以下是假設的代碼段
with dbengine.connect(**details) as db:
cur = db.exec(sql_string)
results = cur.fetchall()
return results
在這種情況下,我希望在使用db.close()選項卡將其選中時 ,將db標記為垃圾回收。
在工作中,我開始看到這段代碼。
with something() as myobj:
logger.info('I got an obj!')
return myobj
我不知道您是否應該像Java中的new關鍵字那樣使用with 。 有人可以指導我使用任何好的文檔,這些文檔可以解釋您在使用時可以/不應該/不應該做什么嗎?
PS日志消息實際上是la腳的:-)
目標名稱with
語句將contextmanager __enter__
返回值綁定到 ( as
之后的名稱),其范圍不僅限於with
語句。 與for
循環變量一樣, as
目標名稱的作用域位於當前函數或模塊名稱空間中。 with
套件結束時,名稱不會消失或以其他方式清除。
因此,在with
語句之外 return myobj
是完全合法的,即使有些荒謬。 with
語句所保證的全部是,在塊完成時將調用something().__exit__()
方法(由於到達塊的末尾,或者是因為continue
, break
或return
語句,或者因為例外)。
也就是說,最好在with
語句內移動返回值:
with something() as myobj:
logger.info('I got an obj!')
return myobj
和
with dbengine.connect(**details) as db:
cur = db.exec(sql_string)
return cur.fetchall()
上下文管理器仍將被正確清理,但是現在return
語句看起來像是with
塊的邏輯部分。 執行順序不變。 調用something().__exit__()
,然后函數返回。
與往常一樣, with
語法上的Python文檔非常出色。 您還可以查看有關上下文管理器的文檔和原始建議PEP-343 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.