Discord.py comment passer ctx comme argument par défaut

Aug 15 2020

J'écris une commande de profil en utilisant Discord.py qui imprime des informations sur l'utilisateur spécifié.

Je voudrais passer l'auteur du message comme argument par défaut, donc si l'utilisateur écrit simplement la commande et rien d'autre, le bot enverra son profil.

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

Le code ci-dessus ne fonctionne pas. Il se trompe avec l'erreur suivante:

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

Quelqu'un peut-il me dire ce que je fais de mal et comment faire fonctionner mon code?

ÉDITER:

J'ai en quelque sorte contourné le problème avec:

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

Ma question demeure, y a-t-il un moyen de passer ctx comme argument par défaut?

Réponses

1 fixmycode Aug 15 2020 at 16:39

La réponse courte est que vous ne pouvez pas faire cela, car vous modifieriez la signature de la fonction. Les commandes sont appelées en attendant cette signature:

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

ctxn'est pas une valeur donnée, juste le nom du premier paramètre. Vous ne pouvez pas faire d'hypothèses sur ce qui va être utilisé.

Ce que vous pouvez faire, c'est supposer le nombre de paramètres, en suivant l'exemple qui se trouve dans la documentation discord.py, vous pouvez faire quelque chose comme ceci:

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

Dans ce code, vous pouvez supposer qu'il memberest toujours un membre, sauf dans un canal privé, alors qu'il s'agirait d'un utilisateur.

2 Videro Aug 15 2020 at 16:37

vous pouvez utiliser ceci -

user = ctx.author if not user else user

au lieu de -

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