Вопрос по поводу снятия ролей

У меня появился такой вопрос, есть у меня в боте одна такая команда, которая снимает все перечисленные роли, но сделана она в очень большом размере, сама команда, и действует чутка медленно, вопрос вообщем-то состоит в том, можно ли как-то сделать в одну строку перечисление ролей или же легче данную команду?

Сама команда:

@client.command()
@commands.has_any_role( 703596629923725334, 703596629911142433, 703596629894365211, 703596629894365210 )
async def unfrac(ctx, member: discord.Member, *,reason = None):
    thhchannel = ctx.message.channel
    ttttt = client.get_channel(703596630892478508)
    if thhchannel == ttttt:
        unfrac_role = discord.utils.get(ctx.message.guild.roles, name = 'test1')
        unfrac_role1 = discord.utils.get(ctx.message.guild.roles, name = 'test2')
        unfrac_role2 = discord.utils.get(ctx.message.guild.roles, name = 'test3')
        unfrac_role3 = discord.utils.get(ctx.message.guild.roles, name = 'test4')
        unfrac_role4 = discord.utils.get(ctx.message.guild.roles, name = 'test5')
        unfrac_role5 = discord.utils.get(ctx.message.guild.roles, name = 'test6')
        unfrac_role6 = discord.utils.get(ctx.message.guild.roles, name = 'test7')
        unfrac_role7 = discord.utils.get(ctx.message.guild.roles, name = 'test8')
        unfrac_role8 = discord.utils.get(ctx.message.guild.roles, name = 'test9')
        unfrac_role9 = discord.utils.get(ctx.message.guild.roles, name = 'test10')
        unfrac_role10 = discord.utils.get(ctx.message.guild.roles, name = 'test11')
        unfrac_role11 = discord.utils.get(ctx.message.guild.roles, name = 'test12')
        unfrac_role12 = discord.utils.get(ctx.message.guild.roles, name = 'test13')
        unfrac_role13 = discord.utils.get(ctx.message.guild.roles, name = 'test14')
        unfrac_role14 = discord.utils.get(ctx.message.guild.roles, name = 'test15')
        unfrac_role15 = discord.utils.get(ctx.message.guild.roles, name = 'test16')
        unfrac_role16 = discord.utils.get(ctx.message.guild.roles, name = 'test17')
        unfrac_role17 = discord.utils.get(ctx.message.guild.roles, name = 'test18')
        unfrac_role18 = discord.utils.get(ctx.message.guild.roles, name = 'test19')
        unfrac_role19 = discord.utils.get(ctx.message.guild.roles, name = 'test20')
        unfrac_role20 = discord.utils.get(ctx.message.guild.roles, name = 'test21')
        unfrac_role21 = discord.utils.get(ctx.message.guild.roles, name = 'test22')


        emb = discord.Embed(title = 'Снятие ролей', colour = discord.Color.purple())
        emb.add_field(name = 'Роль снята.', value = f'Роль снята с пользователя {member.mention}')
        message = await ctx.send(embed = emb)
        await member.remove_roles(unfrac_role)
        await member.remove_roles(unfrac_role1)
        await member.remove_roles(unfrac_role2)
        await member.remove_roles(unfrac_role3)
        await member.remove_roles(unfrac_role4)
        await member.remove_roles(unfrac_role5)
        await member.remove_roles(unfrac_role6)
        await member.remove_roles(unfrac_role7)
        await member.remove_roles(unfrac_role8)
        await member.remove_roles(unfrac_role9)
        await member.remove_roles(unfrac_role10)
        await member.remove_roles(unfrac_role11)
        await member.remove_roles(unfrac_role12)
        await member.remove_roles(unfrac_role13)
        await member.remove_roles(unfrac_role14)
        await member.remove_roles(unfrac_role15)
        await member.remove_roles(unfrac_role16)
        await member.remove_roles(unfrac_role17)
        await member.remove_roles(unfrac_role18)
        await member.remove_roles(unfrac_role19)
        await member.remove_roles(unfrac_role20)
        await member.remove_roles(unfrac_role21)
        await message.add_reaction('✅')

    else:
        await stx.channel.purge(limit = 1)
        channel = stx.message.channel(703596630892478508)

Ответы (1 шт):

Автор решения: Fixator10

Используйте "списковые включения" (PEP 202) для построения списка ролей и снятия ролей через remove_roles поддерживающий несколько аргументов-ролей.

@client.command()
@commands.has_any_role(703596629923725334, 703596629911142433, 703596629894365211, 703596629894365210)
async def unfrac(ctx, member: discord.Member, *, reason: str = None):
    thhchannel = ctx.channel
    ttttt = client.get_channel(703596630892478508)
    if thhchannel == ttttt:
        roles = ['test1', 'test2', 'test3', 'test4', 'test5', 'test6', 'test7', 'test8', 'test9', 'test10', 'test11', 'test12', 'test13', 'test14', 'test15', 'test16', 'test17', 'test18', 'test19', 'test20', 'test21', 'test22']
        roles = [discord.utils.get(ctx.guild.roles, name = role) for role in roles]
        emb = discord.Embed(title = 'Снятие ролей', colour = discord.Color.purple())
        emb.add_field(name = 'Роль снята.', value = f'Роль снята с пользователя {member.mention}')
        message = await ctx.send(embed = emb)
        await member.remove_roles(*roles)
        await message.add_reaction('✅')
    else:
        await ctx.message.delete()  # лучше удалять сообщение напрямую, во избежание "racing condition"

→ Ссылка