TypeError:无法向刚启动的协程发送非无值

Posted

技术标签:

【中文标题】TypeError:无法向刚启动的协程发送非无值【英文标题】:TypeError: can't send non-None value to a just-started coroutine 【发布时间】:2019-09-05 20:12:55 【问题描述】:

我正在尝试添加 on_member_join() 方法,以便在有人加入时使用我自己的自定义消息通知我。

所以我的服务器上有一个名为 main-channel 的频道,我希望机器人打印这些欢迎消息。但是,我不知道该怎么做。 这是我目前的设置,但它不起作用。

我得到的错误是:

忽略 on_member_join 中的异常 回溯(最近一次通话最后): _run_event 中的文件“C:\Users\frenc\PycharmProjects\Discord\discord\client.py”,第 255 行 等待 coro(*args, **kwargs) on_member_join 中的文件“C:/Users/frenc/PycharmProjects/Discord/prova.py”,第 18 行 await channel.send("Benvenuto nel 服务器!") C:\Users\frenc\PycharmProjects\Discord\discord\client.py:262: RuntimeWarning: coroutine 'Member._get_channel' 从未等待 通过

我真的不知道如何让我的机器人将这些消息打印到我服务器上的特定频道。

我使用最新版本的 discord 和 Python 3.6。

import discord

client = discord.Client()


@client.event
async def on_ready():
    print('logged in as')
    print(client.user.name)
    print(client.user.id)
    print('-----')


@client.event
async def on_member_join(member):
    print("Recognised that a member called " + member.name + " joined")
    channel = member._get_channel()
    await channel.send("Welcome to the server!")
    print("Sent message to " + member.name)
    role = discord.utils.get(member.server.roles, name="@everyone")
    await member.add_roles(member, role)
    print("Added role '" + role.name + "' to " + member.name)

client.run(myToken)

【问题讨论】:

能否贴出完整的类型错误,具体需要知道是哪一行导致了错误。这与***.com/questions/19892204/… 有关 【参考方案1】:

您看到此错误是因为您没有等待 _get_channel。协程/生成器有一个send 方法,它与Messageable 对象的send 方法无关。

无论如何你都不应该使用那个协程,因为 Member 对象本身就是可消息的:

@client.event
async def on_member_join(member):
    print("Recognised that a member called " + member.name + " joined")
    await member.send("Welcome to the server!")
    print("Sent message to " + member.name)

    # Probably unnecessary
    role = discord.utils.get(member.server.roles, name="@everyone")
    await member.add_roles(member, role)
    print("Added role '" + role.name + "' to " + member.name)

如果@everyone应该是默认角色,你不需要将它添加到成员,他们会自动得到它(重点是每个人都拥有everyone角色)。

【讨论】:

以上是关于TypeError:无法向刚启动的协程发送非无值的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

Kotlin 协程协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

什么时候释放android服务中的协程资源?

“无法访问主线程上的数据库,因为它可能会长时间锁定 UI。”我的协程错误

带有改造的协程线程安全

Lua中的协程coroutine