首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检验是否等待协同疗法

检验是否等待协同疗法
EN

Stack Overflow用户
提问于 2019-10-25 19:32:37
回答 2查看 568关注 0票数 4

我有一个连接到数据库的异步函数。目前,我的用户做:

代码语言:javascript
复制
conn = await connect(uri, other_params)

我希望继续支持这一点,但希望另外允许将connect()用作上下文管理器:

代码语言:javascript
复制
async with connect(uri, other_params) as conn:
     pass

这两种场景的不同之处在于,在第一种情况下,等待的是connect,而在第二种情况下,则不是。

connect的身体内,是否有可能知道是否等待着协同线?

我目前在repl.it上所做的努力。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-26 04:10:28

下面是通过您提供的测试的代码:

代码语言:javascript
复制
import asyncio
import pytest
from functools import wraps


def connection_context_manager(func):
  @wraps(func)
  def wrapper(*args, **kwargs):

    class Wrapper:
        def __init__(self):
          self._conn = None

        async def __aenter__(self):
            self._conn = await func(*args, **kwargs)
            return self._conn

        async def __aexit__(self, *_):
          await self._conn.close()

        def __await__(self):
            return func(*args, **kwargs).__await__()  # https://stackoverflow.com/a/33420721/1113207
    return Wrapper()

  return wrapper

请注意,三种神奇的方法允许我们同时使对象成为可接受的和异步的上下文管理器。

如果你有问题的话,可以随意提问。

票数 2
EN

Stack Overflow用户

发布于 2019-10-25 20:08:57

我认为你的例子有一个结构性的问题。

因此,首先,您的示例需要await __call__

代码语言:javascript
复制
@pytest.mark.asyncio
async def test_connect_with_context_manager():
    async with await connect("with context uri") as no_context:
        # Now it's open
        assert no_context.open

    # Now it's closed
    assert not no_context.open

但是这里的问题是,await connect("with context uri")的结果是一个Connection,它甚至没有__aexit__方法。

因此,我认为您应该完全改变结构,将connect方法添加到Connection中以实际建立连接,并在MagicConnection中委托Connection的每个方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58564687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档