【发布时间】:2021-06-02 07:15:50
【问题描述】:
我创建了一个名为
add_reaction_tasks的异步函数,它将特定函数映射到字典键。此函数将字典返回到名为tasks的变量,该变量位于事件on_raw_reaction_add中。
第一个问题是tasks = await add_reaction_tasks() 引发以下错误:line 343, in _run_event await coro(*args, **kwargs)。
第二个是当我尝试访问字典时,用tasks 表示,键为which_trigger 和参数payload,出现以下错误:
'1' : await add_rules_messages_tasks, TypeError: object function can't be used in 'await' expression.
我已确保尽可能使用await。除此之外,我不确定我还需要做什么才能使这段代码正常工作。
代码sn-ps:
1) add_reaction_tasks中用到的函数
def display_messages_error(payload = discord.RawReactionActionEvent):
...
async def add_rules_messages_tasks(payload = discord.RawReactionActionEvent):
...
async def add_years_messages_tasks(payload = discord.RawReactionActionEvent):
...
async def add_programming_languages(payload = discord.RawReactionActionEvent):
...
2) add_reaction_tasks 函数
async def add_reaction_tasks():
add_tasks = {
'0' : display_messages_error,
'1' : await add_rules_messages_tasks,
'2' : await add_years_messages_tasks,
'3' : await add_programming_languages
}
return add_tasks
3) on_raw_reaction_add 事件
@bot.event
@commands.bot_has_permissions(manage_roles = True)
async def on_raw_reaction_add(payload : discord.RawReactionActionEvent):
role = None
guild = None
# if the guild is server_name
if payload.guild_id == server_id:
guild = find(lambda g : g.id == server_id, bot.guilds)
member = get(guild.members, id = payload.user_id)
if not guild: return
if not member: return
which_trigger = 0 # 0 stands for invalid message id (should trigger display_message_error function)
try:
which_trigger = str(all_role_reaction_ids[str(payload.message_id)]) # <= looks weird, but works
#print(f'\nwhich_trigger = {which_trigger}\n')
except KeyError as err:
print(f'KeyError: {err}')
print('Invalid role-reaction message id')
return
tasks = await add_reaction_tasks() # <= first error
await tasks[which_trigger](payload) # <= second error
return
【问题讨论】:
-
async def函数是 构造函数 awaitables。await add_rules_messages_tasks()应该可以工作。 -
@MisterMiyagi 这是我在这篇文章的代码之前写的,但它只会执行字典中的所有函数,尽管它提供了一个只会调用某个函数的键。
-
嗯,是的,这就是
await所做的——运行协程。当你不打算等待协程时,为什么要使用await?
标签: python async-await discord.py