【问题标题】:python3.6, difference between async with and awaitpython3.6,async with和await的区别
【发布时间】:2018-01-21 01:14:16
【问题描述】:

这里是来自 python 3.4 的新手开发者。

我的幼稚理解是看到协程是上下文管理器的时候才用async with这个关键字?

【问题讨论】:

  • 嗨,对不起,我让你有这种感觉,我确实看过 PEP 492 资源,它有点简洁。我有点新和愚蠢,只是想确认一下。谢谢:)
  • 很公平。虽然作为规则的坚持者,我认为您的问题与本网站无关,但作为一个处于您一般情况的人,我真的很高兴您得到了您正在寻找的解释。我想这意味着这将对网站的未来访问者合法有用,因此撤回投票。
  • 感谢您的理解!我做了一个快速搜索,似乎在普通和异步上下文管理器之间没有任何比较,如果有人可以提供一些代码示例会很好:)
  • @MadPhysicist 嗨,朋友,你好吗?我今天收到了“好问题徽章”的通知。再次感谢您给这个问题一个机会(我想我们的讨论很好)。希望在这个动荡的covid时期,您和您的家人一切都好。欢呼:P
  • 我想它确实老化得很好。获得徽章的好工作。一切都很好。希望你也一样。

标签: python-3.x python-3.6 python-asyncio


【解决方案1】:

来自PEP 492

提出了一个异步上下文管理器的新声明:

async with EXPR as VAR:
    BLOCK

在语义上等价于:

mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__(mgr)

VAR = await aenter
try:
    BLOCK
except:
    if not await aexit(mgr, *sys.exc_info()):
        raise
else:
    await aexit(mgr, None, None, None)

所以是的——它让给从给定上下文管理器的 __aenter__ 方法返回的协程,一旦返回就运行你的块,然后让给 __aexit__ 协程。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2015-01-14
    • 1970-01-01
    • 2019-10-08
    • 2020-09-16
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多