关于 yield 的使用,网上能搜到的都是生成器的用法,都以 yield n 的形式返回一个值。 但是我在 odoo 中看到一段代码:
@classmethod
@contextmanager
def manage(cls):
""" Context manager for a set of environments. """
if hasattr(cls._local, 'environments'):
yield
else:
try:
cls._local.environments = Environments()
yield
finally:
release_local(cls._local)
调用语法:
with odoo.api.Environment.manage():
with registry.cursor() as cr:
odoo.tools.trans_export(config["language"],
config["translate_modules"] or ["all"], buf, fileformat, cr)
有大佬能指点一下这个 yield 什么用处吗?
1
SjwNo1 2021-03-26 22:32:00 +08:00
因为是 contextmanager,所以 yield 之前的部分相当于__enter__, 之后的逻辑相当于__exit__,这里 yield 返回 None 是因为上下文不需要 as obj
|