【问题标题】:Awaiting a coroutine and assigning the result to a variable outside of a coroutine等待协程并将结果分配给协程外部的变量
【发布时间】:2020-05-15 13:07:26
【问题描述】:

我希望能够制作一个我可以调用的 utils 文件,该文件使用所有从数据库请求数据的命令列表:

import asyncpg

async def is_registered(ctx):
    pg_con = await asyncpg.create_pool(database="Db", user="postgres", password=db_pw)
    registered = await pg_con.execute("SELECT EXISTS (SELECT 1 FROM users WHERE user_id = $1)", ctx.author.id)
    if registered:
        await ctx.send("hi")
        return True
    else:
        return False

async def is_registered(ctx): #another function
    pg_con = await asyncpg.create_pool(database="Db", user="postgres", password=db_pw)
    registered = await pg_con.execute("SELECT EXISTS (SELECT 1 FROM users WHERE user_id = $1)", ctx.author.id)
    if registered:
        await ctx.send("hi")
        return True
    else:
        return False

...

等等。我想使用import 在另一个文件中调用这些函数。每次命名pg_con 是否有任何缺点,有没有办法处理它,所以我不必这样做?有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: python import async-await discord.py asyncpg


    【解决方案1】:

    使用连接池执行单个查询是没有意义的,每次建立连接/池会慢很多。

    处理此问题的更好方法是将Bot 子类化并将连接池添加为属性。
    这样,您就可以通过Context.bot 访问一个池。

    另外,请注意,在您的示例中,您正在隐藏函数。

    【讨论】:

    • 但是,为了调用它,我需要从我的 utils 文件夹中访问子类 Bot,该文件夹不是从它派生的。我该怎么做?
    • 如果您使用子类代替Bot,您可以像我说的那样通过Context.bot 访问它,因为您将Context 对象传递给示例中的函数。
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2020-04-08
    • 2018-03-13
    • 2021-01-27
    • 2021-05-13
    • 2021-06-10
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多