python 异步上下文管理器

2023-11-29

在 Python Lan 参考文献中。 3.4.4,据说__aenter__() and __aexit__()必须返回可等待的内容。但是,在示例异步上下文管理器中,这两个方法返回 None:

class AsyncContextManager:
    async def __aenter__(self):
        await log('entering context')

    async def __aexit__(self, exc_type, exc, tb):
        await log('exiting context')

这段代码正确吗?


__aenter__ and __aexit__必须返回等待对象,但是看看当您调用示例中的等待对象时会发生什么:

>>> class AsyncContextManager:
...     async def __aenter__(self):
...         await log('entering context')
...     async def __aexit__(self, exc_type, exc, tb):
...         await log('exiting context')
... 
>>> AsyncContextManager().__aenter__()
<coroutine object AsyncContextManager.__aenter__ at 0x7f5b092d5ac0>

它没有回来None!我们得到了一个协程对象,它是可等待的。

这些方法是async函数,它自动返回(可等待的)异步协程。return正文中的语句async函数确定当您返回什么时await协程,而不是调用函数时返回的内容。

这类似于生成器函数返回生成器迭代器的方式,尽管它们通常没有return声明,以及如果你写的话怎么写__iter__作为生成器函数,您不应该尝试return生成器函数内的迭代器。


那么如果你确实放了一个会发生什么return in __aenter__ or __aexit__定义为async功能?好吧,你可以,如果你这样做了,return语句不必返回可等待的。这就是 Python 将要做的事情。

If you return某事从__aenter__定义为async函数,它决定绑定到什么as目标,如果async with uses as.

If you return某事从__aexit__定义为async函数,它确定是否抑制块内引发的异常。 “真实”值告诉async with抑制异常,而“假”值告诉async with让异常传播。默认None为 false,因此默认情况下不会抑制异常。

这是一个例子:

import asyncio

class Example:
    async def __aenter__(self):
        return 3
    async def __aexit__(self, exc_type, exc, tb):
        return True

async def example():
    async with Example() as three:
        print(three == 3)
        raise Exception
    print("Exception got suppressed")

asyncio.run(example())

Output:

True
Exception got suppressed
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 异步上下文管理器 的相关文章

随机推荐

  • 如何使用 Ninject 将服务注入到 MVC 3 FilterAttributes 中?

    我正在为我的 MVC 项目编写一个自定义 ErrorHandler 属性 我想将 EventViewerLogger 的实现注入到该属性中 我正在使用 Ninject 2 2 它对于其他功能运行良好 例如注入存储库和通过控制器构造函数聚合服
  • Tkinter 标签不显示图像

    我正在尝试学习一些 tkinter 我无法让 tkinter 显示图标 我不知道哪里出了问题 它不会产生任何错误 并且尊重图像的大小 但它是不可见的 我在网上找到的所有内容都告诉我们添加第二个引用以防止 python 进行垃圾收集 但不知怎
  • 使用 OpenOCD 的 ARM LPC1768 的 Eclipse GDB“初始化”和“运行”设置?

    我终于想通了如何让代码运行在这个LPC1768迷你板 但是现在我正在尝试进行调试 我使用的工具链是 Yagarto Eclipse Indigo 带 GDB 硬件调试器 OpenOCD 我的JTAG接口是 巴士冲击波 V2 board 我找
  • 如何使用 JavaScript 在单击事件上显示工具提示

    如何通过使用 JavaScript 单击按钮来显示工具提示 这是我的代码 HTML div class tooltip Hover over me div class tooltiptext div div
  • 为不同用户返回VBA网络驱动器号

    我为自己和同事创建了一个门户 用于下载引用不同网络驱动器的工作簿模板 以进行整合 该门户托管在 会计 Z 驱动器中 但其中一个工作簿引用了不同驱动器 BI Y 中的电子表格 这在我的机器上运行得非常好 但我的同事有不同的驱动器号 例如 M
  • 在 xcode 4 中使用 UIModalTransitionStylePartialCurl 导航时在 ios 设备上崩溃

    我在 ios 4 设备上使用 UIModalTransitionStylePartialCurl 在我的测试应用程序中 我有 2 个类 每个类中有一个按钮 在第一页单击按钮时 它将导航到第二页 通过向上卷曲页面 但在第二页中当我单击后退按钮
  • R 中的数据转换:更好地对行值或因子级别进行操作?

    假设您注意到大因子向量中的一些值是相似的 巩固这些价值观的更好策略是什么 我在分析中使用了两种策略 这两种策略在性能上似乎具有可比性 1 将合并逻辑放入函数中并使用sapply和 2 改变因子水平本身 下面我为每一个都制作了一个例子 示例
  • 如何找到矩形矩阵的列空间的基?

    给定一个 numpyndarray尺寸为 m n 其中 n gt m 如何找到线性独立的列 一种方法是使用LU分解 因素U将与您的矩阵大小相同 但将是上三角的 在每一行中U 选取第一个非零元素 这些是枢轴元素 属于线性独立列 一个独立的例子
  • 像 SAS 一样加入 bash

    我想加入两个文件bash使用公共列 我想保留两个文件中所有可配对和不可配对的行 不幸的是使用join我可以仅从一个文件中保存不可配对的字段 例如 join 1 1 2 2 a1 t 我还想保留两个文件中重复条目 在连接列中 的所有配对 IE
  • php + unixODBC + DB2 + DESCRIBE = 令牌无效?

    我试图运行的代码 query DESCRIBE TABLE TABLENAME result odbc exec h query 结果 PHP 警告 odbc exec SQL 错误 unixODBC IBM iSeries Access
  • Analytics API 返回:错误请求 - invalid_grant

    我正在使用 Google Analytics API v3 我现在将解释我的申请流程 我在这里使用了这个文档 https developers google com accounts docs OAuth2WebServer 首先 为用户生
  • Apache Commons SCXML - 找不到 JexlContext

    我是 SCXML 新手 甚至无法启动最简单的应用程序 当我尝试启动它时 出现以下异常 但我有图书馆commons scxml 0 9 jar将该类放在类路径上 有任何想法吗 Exception in thread main java lan
  • 无法禁用特定 Android 设备上的主页按钮

    我知道这个问题已经被问过很多次了 答案总是 不 我们不能禁用主页按钮 我有一些不同的问题要问 我编写了简单的代码 其中我的活动覆盖 onKeyDown 并为所有按键返回 true 从理论上讲 这意味着无论谁打开该应用程序 都会被困在那里 并
  • 如何根据文本长度使 UITextView 高度动态变化?

    正如你在这张图片中看到的 the UITextView根据文本长度改变它的高度 我想让它根据文本长度调整它的高度 我看到了其他问题 但那里的解决方案对我不起作用 this Works对我来说 所有其他解决方案都没有 func adjustU
  • 如何在 Visual Studio Code 中使用多根工作区的调试启动配置?

    调试自多根工作空间似乎不起作用 这些是一个新功能 也许这是一个错误 但没有实际的例子 只是网站上的伪代码 Attribute program is not absolute workspaceFolder node modules moch
  • 尝试远程调试时未能找到进程调度程序的空闲套接字端口

    强调 Windows 10 主机 ubuntu vagrant box virtualbox 作为访客虚拟机 使用 vagrant 端口转发 如下所示 config vm network forwarded port guest 1234
  • Apache Poi 安卓

    我在用Apache Poi在 Android 应用程序中 但我有一个问题HSSFWorkbook 我只想读取 Android 平板电脑内存中的 Excel 文件 在Android应用程序中显示数据 我的代码 Override protect
  • Java 8 流处理不流畅[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我对 Java 8 流有一个问题 其中数据是突然批量处理的 而不是在请求时处理的 我有一个相当复杂的流 必须并行化 因为我使用concat合并两个流 我的问题源于这样一个事实 数据似乎
  • Maven 程序集插件未在解压的 dependencySet 上应用 fileMode

    整个下午我都在用头撞墙 我需要创建一对程序集 zip and tgz 并且需要为存档中包含的 shell 脚本设置正确的可执行权限 我所做的似乎没有任何区别fileMode设置似乎没有效果 这是我的程序集描述符的一个片段
  • python 异步上下文管理器

    在 Python Lan 参考文献中 3 4 4 据说 aenter and aexit 必须返回可等待的内容 但是 在示例异步上下文管理器中 这两个方法返回 None class AsyncContextManager async def