3.4.4. 异步上下文管理器
异步上下文管理器 是 上下文管理器 的一种,它能够在其 __aenter__
和 __aexit__
方法中暂停执行。
异步上下文管理器可在 async with
语句中使用。
object.__aenter__
(self)
在语义上类似于 __enter__()
,仅有的区别是它必须返回一个 可等待对象。
object.__aexit__
(self, exc_type, exc_value, traceback)
在语义上类似于 __exit__()
,仅有的区别是它必须返回一个 可等待对象。
异步上下文管理器类的一个示例:
class AsyncContextManager:
async def __aenter__(self):
await log('entering context')
async def __aexit__(self, exc_type, exc, tb):
await log('exiting context')
3.5 新版功能.
脚注
在某些情况下 有可能 基于可控的条件改变一个对象的类型。 但这通常不是个好主意,因为如果处理不当会导致一些非常怪异的行为。
__hash__()
, __iter__()
, __reversed__()
以及 __contains__()
方法对此有特殊处理;其他方法仍会引发 TypeError
,但可能依靠 None
属于不可调用对象的行为来做到这一点。
这里的“不支持”是指该类无此方法,或方法返回 NotImplemented
。 如果你想强制回退到右操作数的反射方法,请不要设置方法为 None
— 那会造成显式地 阻塞 此种回退的相反效果。
对于相同类型的操作数,如果非反射方法 — 例如 __add__()
— 失败则会认为整个运算都不被支持,这就是反射方法未被调用的原因。