【问题标题】:TypeError: object function can't be used in await expressionTypeError:对象函数不能在等待表达式中使用
【发布时间】: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


【解决方案1】:

即使字典中的最后三个函数是异步的,删除它们之前的 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

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多