Discord.py como passar ctx como um argumento padrão

Aug 15 2020

Estou escrevendo um comando de perfil usando Discord.py que imprime informações sobre o usuário especificado.

Eu gostaria de passar o autor da mensagem como o argumento padrão, então se o usuário apenas escrever o comando e nada mais, o bot enviará seu perfil.

@bot.command()
async def profile(ctx, *, user: discord.Member = ctx.message.author):

O código acima não funciona. Ele apresenta o seguinte erro:

Traceback (most recent call last):
  File "bot.py", line 50, in <module>
    async def profile(ctx, *, user: discord.Member = ctx.message.author.name):
NameError: name 'ctx' is not defined

Alguém pode me dizer o que estou fazendo de errado e como fazer meu código funcionar?

EDITAR:

Eu meio que contornei o problema com:

@bot.command()
async def profile(ctx, *, user: discord.Member=None):
        if(user == None):
                user = ctx.message.author

Minha pergunta ainda permanece, há alguma maneira de passar ctx como um argumento padrão?

Respostas

1 fixmycode Aug 15 2020 at 16:39

A resposta curta é que você não pode fazer isso, pois estaria alterando a assinatura da função. Os comandos são chamados esperando esta assinatura:

async def my_command(ctx, *args, **kwargs):

ctxnão é um valor fornecido, apenas o nome do primeiro parâmetro. Você não pode fazer suposições sobre o que será usado.

O que você pode fazer é assumir o número de parâmetros, seguindo o exemplo que está na documentação do discord.py, você pode fazer algo assim:

async def profile(ctx, *, user:discord.Member):
    member = user or ctx.message.author

Neste código, você pode assumir que memberé sempre um Membro, exceto em um canal privado, quando seria um Usuário.

2 Videro Aug 15 2020 at 16:37

você pode usar isso -

user = ctx.author if not user else user

em vez de -

if(user == None):
                user = ctx.message.author