3.4.4. 异步上下文管理器

异步上下文管理器上下文管理器 的一种,它能够在其 __aenter____aexit__ 方法中暂停执行。

异步上下文管理器可在 async with 语句中使用。

object.__aenter__(self)

在语义上类似于 __enter__(),仅有的区别是它必须返回一个 可等待对象

object.__aexit__(self, exc_type, exc_value, traceback)

在语义上类似于 __exit__(),仅有的区别是它必须返回一个 可等待对象

异步上下文管理器类的一个示例:

  1. class AsyncContextManager:
  2. async def __aenter__(self):
  3. await log('entering context')
  4. async def __aexit__(self, exc_type, exc, tb):
  5. await log('exiting context')

3.5 新版功能.

脚注

1

在某些情况下 有可能 基于可控的条件改变一个对象的类型。 但这通常不是个好主意,因为如果处理不当会导致一些非常怪异的行为。

2

__hash__(), __iter__(), __reversed__() 以及 __contains__() 方法对此有特殊处理;其他方法仍会引发 TypeError,但可能依靠 None 属于不可调用对象的行为来做到这一点。

3

这里的“不支持”是指该类无此方法,或方法返回 NotImplemented。 如果你想强制回退到右操作数的反射方法,请不要设置方法为 None — 那会造成显式地 阻塞 此种回退的相反效果。

4

对于相同类型的操作数,如果非反射方法 — 例如 __add__() — 失败则会认为整个运算都不被支持,这就是反射方法未被调用的原因。