簡體   English   中英

如何在python中使用上下文管理器

[英]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__()方法(由於到達塊的末尾,或者是因為continuebreakreturn語句,或者因為例外)。

也就是說,最好在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM