我非常喜欢Python中的returns库,并且我想更多地使用它.我现在有一个小问题.目前,我有一个使用redis客户端并获取与键对应的值的函数,如下所示:

from redis import Redis
from returns.context import RequiresContext


def get_value(key: str) -> RequiresContext[str, Redis]:
    def inner(client: Redis) -> str:
        value = client.get(key)
        return value.decode("utf-8")

    return RequiresContext(inner)

显然,该功能就像一种魅力:

with Redis(
        host=redis_host,
        port=redis_port,
        password=redis_password,
    ) as redis_client:
        value = get_value(key="my-key")(redis_client)
        print("value = ", value)

现在,我想使用该代码的Incio吊坠,即使用redis.asyncio.Redis.不幸的是,在这种情况下,事情看起来变得有点复杂.我可能应该从RequiresContext切换到RequiresContextFutureResultE,但我找不到工作解决方案.这是我能想出的最好的代码:

async def get_value(key: str) -> RequiresContextFutureResultE[str, Redis]:
    async def inner(client: Redis) -> FutureResultE[str]:
        value = await client.get(key)
        return FutureResult.from_value(value.decode("utf-8"))

    return RequiresContextFutureResultE(inner)

当我这样运行它时:

async def main():
    async with Redis(
        host="localhost",
        port=6379,
        password="902nks291",
        db=15,
    ) as redis_client:
        rcfr = get_value(key="user-id")
        value = await rcfr(redis_client)
        print("value: ", value)

asyncio.run(main())

我得到的错误是rcfr不是可调用的.有人可以帮助我弄清楚如何修复我的代码,使其以我想要的方式工作吗?

推荐答案

如果您调用用async def定义的函数(get_value),您将获得一个awaable,您必须将其与await一起使用才能获得其返回值.这就是为什么您会得到错误.

get_value不应该是async def.它只是定义并返回一个函数(由RequiresContextFutureResultE包装),它本身不执行任何IO.

Python相关问答推荐

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如果索引不存在,pandas系列将通过索引获取值,并填充值

Pandas 第二小值有条件

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

使用numpy提取数据块

根据另一列中的nan重置值后重新加权Pandas列

无法使用requests或Selenium抓取一个href链接

如何获得每个组的时间戳差异?

avxspan与pandas period_range

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

Scrapy和Great Expectations(great_expectations)—不合作

删除marplotlib条形图上的底边

使用BeautifulSoup抓取所有链接

从源代码显示不同的输出(机器学习)(Python)

我什么时候应该使用帆布和标签?

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

Polars定制函数返回多列

对于标准的原始类型注释,从键入`和`从www.example.com `?

EST格式的Azure数据库笔记本中的当前时间戳

如何从一个维基页面中抓取和存储多个表格?