• 3.4.4. 异步上下文管理器

    3.4.4. 异步上下文管理器

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

    异步上下文管理器可在 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.  
    5. async def __aexit__(self, exc_type, exc, tb):
    6. await log('exiting context')

    3.5 新版功能.

    脚注

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

    • 2

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

    • 3

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

    • 4

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