在Python初始化方法中使用异步等待

在Python初始化方法中使用异步等待,python,async-await,discord.py,Python,Async Await,Discord.py,我正在编写一个类,希望在\uuuu init\uuu方法中使用一个异步函数来设置该类所需的一些变量。问题是,我不能这样做,因为\uuuu init\uuu必须是同步的 以下是我的代码的相关部分(为简单起见进行了编辑,逻辑保持不变): 正如你所看到的,这是一个不和谐的机器人,但这并不重要,更多的是关于逻辑 我要调用的函数是asyncDatabaseConnection.setValue(“key”、“value”) 就像我说的,我不能从\uuuuu init\uuuuu调用它,因为\uuuuuu

我正在编写一个类,希望在
\uuuu init\uuu
方法中使用一个异步函数来设置该类所需的一些变量。问题是,我不能这样做,因为
\uuuu init\uuu
必须是同步的

以下是我的代码的相关部分(为简单起见进行了编辑,逻辑保持不变):

正如你所看到的,这是一个不和谐的机器人,但这并不重要,更多的是关于逻辑

我要调用的函数是
asyncDatabaseConnection.setValue(“key”、“value”)

就像我说的,我不能从
\uuuuu init\uuuuu
调用它,因为
\uuuuuu init\uuuuu
必须是同步的,所以我在init调用期间将
firstRun
设置为
True
,然后我可以用它来判断代码之前是否运行过

on\u ready
是一个在bot准备好开始发送/接收数据时调用的函数,因此我可以将其作为第二个
\uuuu init\uuu
使用。问题在于,在整个程序运行过程中,
on_ready
可以被多次调用,这意味着我必须进行前面描述的
firstRun
检查


这似乎有很多代码只是为了在启动时做一件事(以及在调用
on\u ready
时增加开销,无论多么小)。有更干净的方法吗?

这有点尴尬,但您可以运行它并获得结果。如果您经常这样做,编写帮助函数可能会有所帮助:

def run_and_get(coro):
    task = asyncio.create_task(coro)
    asyncio.get_running_loop().run_until_complete(task)
    return task.result()

class discordBot(discord.Client):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        run_and_get(asyncDatabaseConnection.setValue("key", "value"))

这取决于是否存在一个正在运行的事件循环,我相信这是
客户机。

我认为应该有一个函数来执行异步任务,然后同步初始化并返回类的实例。这似乎可以解决我的问题。为什么要将
coro
变成
任务
?它只是为了得到一个返回值吗?如果我不需要返回值,我是否可以执行
运行直到完成(coro)
?我认为如果您这样做,它只会为该协同程序创建一个任务或未来,因此不应该有任何性能影响。
def run_and_get(coro):
    task = asyncio.create_task(coro)
    asyncio.get_running_loop().run_until_complete(task)
    return task.result()

class discordBot(discord.Client):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        run_and_get(asyncDatabaseConnection.setValue("key", "value"))