[英]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.