繁体   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