Discord.py come passare ctx come argomento predefinito

Aug 15 2020

Sto scrivendo un comando di profilo utilizzando Discord.py che stampa le informazioni sull'utente specificato.

Vorrei passare l'autore del messaggio come argomento predefinito, quindi se l'utente scrive solo il comando e nient'altro, il bot invierà il proprio profilo.

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

Il codice sopra non funziona. Si sbaglia con il seguente errore:

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

Qualcuno può dirmi cosa sto sbagliando e come far funzionare il mio codice?

MODIFICARE:

Ho in qualche modo aggirato il problema con:

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

La mia domanda rimane ancora, c'è un modo per passare ctx come argomento predefinito?

Risposte

1 fixmycode Aug 15 2020 at 16:39

La risposta breve è che non puoi farlo, poiché altereresti la firma della funzione. I comandi vengono chiamati aspettando questa firma:

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

ctxnon è un valore dato, solo il nome del primo parametro. Non puoi fare supposizioni su ciò per cui verrà utilizzato.

Quello che puoi fare è assumere il numero di parametri, seguendo l'esempio che è nella documentazione di discord.py, puoi fare qualcosa del genere:

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

In questo codice, puoi presumere che membersia sempre un membro, tranne che in un canale privato, quando sarebbe un utente.

2 Videro Aug 15 2020 at 16:37

puoi usare questo -

user = ctx.author if not user else user

invece di -

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