产量 contextlib.contextmanager

yield in contextlib.contextmanager

为什么我可以跳过在 yield log_func 中调用 log_func,即我可以只写 yield 而代码仍然有效。这是为什么? yield 在这种情况下如何工作?

import time
from contextlib import contextmanager

@contextmanager
def log_exec(log_func):
    s = time.perf_counter()
    yield log_func
    e = time.perf_counter()
    log_func(e - s)

with log_exec(log.debug):
    time.sleep(1)

摘自documentation

This iterator must yield exactly one value, which will be bound to the targets in the with statement’s as clause, if any.

您没有使用 as 子句,因此结果没有改变。但是,如果您尝试将它与空 yield 一起使用,您将看到生成的值为 None.

with log_exec(debug) as log_foo:
    print(log_foo)
    time.sleep(1)