当__aenter __()使用'async with'失败时会发生什么?

杜兰达

PEP 492提到:

async with EXPR as VAR:
    BLOCK

在语义上等效于:

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

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

但是,VAR = await aenter(mgr)它不在try块中,因此我想知道是否__aenter__()允许失败。

例如,在以下aiohttp代码片段中(摘自《入门指南》):

import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], "...")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

session.get('http://python.org')可能会失败,__aexit__()并且不会被调用以关闭上下文。

user2357112支持Monica

如果__aenter__失败,__aexit__的确是无法运行。__aenter__在这种情况下,必须进行任何必要的清理

__aenter__有更多关于如何初始化以及成功初始化或未成功初始化的内容的信息,因此__aenter__处理该对象比__aexit__处理清理任意部分输入的上下文管理器状态要方便得多

(对于普通的非异步上下文管理器,这是完全相同的。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在document.ready内部使用async = true时会发生什么?

来自分类Dev

尝试使用Java捕获-发生异常时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

当您使用浏览器返回时会发生什么?

来自分类Dev

在python中的str上使用encoding时会发生什么?

来自分类Dev

在AngularJS中删除ngRepeat使用的对象时会发生什么?

来自分类Dev

以管理员身份使用时会发生什么?

来自分类Dev

尝试使用数组变量时会发生什么

来自分类Dev

当我截断正在使用的文件时会发生什么?

来自分类Dev

使用/ noguiboot参数启动系统时会发生什么?

来自分类Dev

当我使用多个模拟时间时会发生什么?

来自分类Dev

停止使用的服务包时会发生什么

来自分类Dev

使用async:对于ajax为true,触发的事件会发生什么

来自分类Dev

断言检查失败时会发生什么?

来自分类Dev

当我在Bash脚本中对函数使用`&`时会发生什么?

来自分类Dev

在视觉上,当您使用&符号调用同一进程时会发生什么

来自分类Dev

使用另一个(现有)对象创建新对象时会发生什么?

来自分类Dev

不等待HttpClient使用时会发生什么情况

来自分类Dev

使用Java中的main方法为类创建对象时会发生什么

来自分类Dev

当使用块范围变量进行JS封闭时会发生什么?

来自分类Dev

当您使用Task.Run太多而导致线程池耗尽时会发生什么?

来自分类Dev

使用Microsoft Exchange Services托管API,当要同步的项目超过512个时会发生什么?

来自分类Dev

filepicker.io当某些文件已使用pickAndStore完成但用户关闭模式时会发生什么?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

在ruby中使用字符串插值时会发生什么?

来自分类Dev

当我混合使用有符号和无符号类型时会发生什么?

来自分类Dev

当您使用多个嵌套作用域时会发生什么?

来自分类Dev

使用jQuery的remove方法删除脚本标签时会发生什么?

来自分类Dev

使用“ + =”在Java中“更改”字符串时会发生什么情况?

Related 相关文章

  1. 1

    在document.ready内部使用async = true时会发生什么?

  2. 2

    尝试使用Java捕获-发生异常时会发生什么?

  3. 3

    当我使用多个模拟时间时会发生什么?

  4. 4

    当您使用浏览器返回时会发生什么?

  5. 5

    在python中的str上使用encoding时会发生什么?

  6. 6

    在AngularJS中删除ngRepeat使用的对象时会发生什么?

  7. 7

    以管理员身份使用时会发生什么?

  8. 8

    尝试使用数组变量时会发生什么

  9. 9

    当我截断正在使用的文件时会发生什么?

  10. 10

    使用/ noguiboot参数启动系统时会发生什么?

  11. 11

    当我使用多个模拟时间时会发生什么?

  12. 12

    停止使用的服务包时会发生什么

  13. 13

    使用async:对于ajax为true,触发的事件会发生什么

  14. 14

    断言检查失败时会发生什么?

  15. 15

    当我在Bash脚本中对函数使用`&`时会发生什么?

  16. 16

    在视觉上,当您使用&符号调用同一进程时会发生什么

  17. 17

    使用另一个(现有)对象创建新对象时会发生什么?

  18. 18

    不等待HttpClient使用时会发生什么情况

  19. 19

    使用Java中的main方法为类创建对象时会发生什么

  20. 20

    当使用块范围变量进行JS封闭时会发生什么?

  21. 21

    当您使用Task.Run太多而导致线程池耗尽时会发生什么?

  22. 22

    使用Microsoft Exchange Services托管API,当要同步的项目超过512个时会发生什么?

  23. 23

    filepicker.io当某些文件已使用pickAndStore完成但用户关闭模式时会发生什么?

  24. 24

    使用类函数更改S4对象的“类”时会发生什么情况?

  25. 25

    在ruby中使用字符串插值时会发生什么?

  26. 26

    当我混合使用有符号和无符号类型时会发生什么?

  27. 27

    当您使用多个嵌套作用域时会发生什么?

  28. 28

    使用jQuery的remove方法删除脚本标签时会发生什么?

  29. 29

    使用“ + =”在Java中“更改”字符串时会发生什么情况?

热门标签

归档