解决错误“ NoneType”对象没有属性“ id”

时间:2019-01-24 23:56:33

标签: python python-3.x discord.py

我遇到了这个错误,但是我没有在脚本的任何地方要求id

import discord

from discord.ext import commands
client = commands.Bot(command_prefix = 't-')
client.remove_command("help")

@client.event
async def on_ready():
    print ('ready')

@client.command(pass_context=True)
async def addrole(ctx,name,hex):
    user = ctx.message.author
    role = discord.utils.get(user.server.roles, name=name, color=hex[1:]) #the [1:] removes the # in addrole name #ff0000
    await client.add_roles(user, role) #And this line should give me the role after it's created

我希望当有人说t-addrole Role_name #hex时,应该以该人的名字和十六进制的颜色来创建角色

2 个答案:

答案 0 :(得分:1)

role = discord.utils.get(...)最有可能返回None

尝试通过测试打印来确保可能(仅用于调试目的)

如果roleNone,而您尝试使用add_roles(),那么我的确记得它给我一个NoneType的错误,其中涉及到id,就像你在解释。所以我要走出去,并假设这是您的问题。 Discord.py最有可能不检查您是否将其作为None参数发送给*roles,因此会出现此错误。

因此,我建议您实施检查。

async def addrole(ctx,name,hex):
    user = ctx.message.author
    hex = hex.replace('#', '')
    role = discord.utils.get(user.server.roles, name=name, color=hex)
    if role:
        await client.add_roles(user, role) 
    else:
        #Idk what version of python/discord you're using so adjust this line as needed
        await ctx.send(f"Rolename {name} with #{hex} color was not found")

编辑

请务必查看@Tristo的答案,因为您的错误实际上是由于hex未被转化为discord.Color而引起的。 虽然不会窃取他的代码/答案

答案 1 :(得分:1)

错误来自

  

new_roles = utils._unique(roer.id,用于itertools.chain(成员。角色,角色))

您的角色未找到该角色
role = discord.utils.get(user.server.roles, name=name, color=hex[1:])
您可以通过在其下方添加一个print(role)之类的内容来进行确认,它应打印出None

另外,如果您读到有关discord.utils.get的信息,您可能会看到attrs是迭代器成员的属性,是必需的

在这种情况下,user.server.roles是一个包含user.server.roles的可迭代项,如果要按名称和颜色进行搜索,则需要分别传递字符串和discord.Color

这意味着您需要将role = discord.utils.get(user.server.roles, name=name, color=hex[1:])更改为

hex = discord.Colour(int(f'0x{hex[1:]}', 16))
role = discord.utils.get(user.server.roles, name=name,color = hex )