Discord.py como passar ctx como um argumento padrão
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
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):
ctx
nã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.
você pode usar isso -
user = ctx.author if not user else user
em vez de -
if(user == None):
user = ctx.message.author