类型错误:对象函数不能在await表达式中使用。

4
我创建了一个异步函数叫做add_reaction_tasks,它将特定的函数映射到字典键。该函数将该字典返回到名为on_raw_reaction_add的事件中的变量tasks中。
第一个问题是tasks = await add_reaction_tasks()引发以下错误:line 343, in _run_event await coro(*args, **kwargs)
第二个问题是当我尝试使用关键字which_trigger和参数payload访问由tasks表示的字典时,会引发以下错误:'1' : await add_rules_messages_tasks, TypeError: object function can't be used in 'await' expression
我已确保在可能的情况下使用了await。除此之外,我不确定还需要完成哪些任务才能使这段代码正常工作。
代码片段如下: 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" 函数是可等待对象的构造函数。应该可以使用 "await add_rules_messages_tasks()"。 - MisterMiyagi
@MisterMiyagi,这是我在此帖子上代码之前写的内容,但它会执行字典中的所有函数,尽管提供了一个只调用特定函数的键。 - Alexandros Voliotis
好的,没错,这就是“await”所做的——运行一个协程。那么当你不打算等待协程时,为什么要使用“await”呢? - MisterMiyagi
1个回答

2

尽管字典中的最后三个函数是异步的,但在它们之前删除await关键字,使它们像普通函数一样运行,不会引发错误。

然而,既然没有在它们之前使用await关键字,它们如何被异步运行呢?

可运行代码

async def add_reaction_tasks():
    add_tasks = {
                    '0' : display_messages_error,
                    '1' : add_rules_messages_tasks,
                    '2' : add_years_messages_tasks,
                    '3' : add_programming_languages
                }
    
    return add_tasks

看到了同样的问题。你解决了吗? - Black
1
@Black 是的,它解决了我的问题。直到今天我仍然不知道它是如何工作的,但它确实起作用了。 - Alexandros Voliotis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接