Python 当使用'时uu aenter_uuuuuuuuuuuuuuuuuuuuuo()失败时会发生什么;与';异步;?

Python 当使用'时uu aenter_uuuuuuuuuuuuuuuuuuuuuo()失败时会发生什么;与';异步;?,python,python-3.x,python-asyncio,semantics,aiohttp,Python,Python 3.x,Python Asyncio,Semantics,Aiohttp,报告提到: 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

报告提到:

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
块中,因此我想知道
\uuu-aenter\uuu()
是否允许失败

例如,在这个
aiohttp
片段中(取自):


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

如果
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\uuuuuu
失败,
确实不会运行。在这种情况下,任何需要的清理都是
\uuuu aenter\uuuu
的责任

\uuuuuu aenter\uuuuuuu
有更多关于它达到了什么程度以及成功初始化了什么或没有初始化什么的信息,因此使用
\uuuuuuuuu aenter\uuuuuuuuuu
处理此操作要比期望
\uuuuuuuuuuuu aexit\uuuuuu
处理任意部分输入的上下文管理器状态更方便

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

\uuuuu aexit\uuu()
不会被调用来关闭上下文。-你指的是什么背景?会话将关闭,因为异常发生在与
异步的外部
的主体中。如果您的意思是
response
,则没有什么可关闭的,因为
session.get(…)
从未完成运行,而是引发了异常。
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())