Discord.py, wie ctx als Standardargument übergeben wird

Aug 15 2020

Ich schreibe mit Discord.py einen Profilbefehl, der Informationen über den angegebenen Benutzer ausgibt.

Ich möchte den Nachrichtenautor als Standardargument übergeben. Wenn der Benutzer also nur den Befehl und nichts anderes schreibt, sendet der Bot sein Profil.

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

Der obige Code funktioniert nicht. Es tritt ein Fehler mit folgendem Fehler auf:

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

Kann mir jemand sagen, was ich falsch mache und wie mein Code funktioniert?

BEARBEITEN:

Ich habe das Problem irgendwie umgangen mit:

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

Meine Frage bleibt weiterhin: Gibt es eine Möglichkeit, ctx als Standardargument zu übergeben?

Antworten

1 fixmycode Aug 15 2020 at 16:39

Die kurze Antwort lautet, dass Sie dies nicht tun können, da Sie die Signatur der Funktion ändern würden. Befehle werden mit der Erwartung dieser Signatur aufgerufen:

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

ctxist kein gegebener Wert, nur der Name des ersten Parameters. Sie können keine Annahmen darüber treffen, wofür verwendet werden soll.

Sie können die Anzahl der Parameter annehmen. Nach dem Beispiel in der Dokumentation zu discord.py können Sie Folgendes tun:

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

In diesem Code können Sie davon ausgehen, dass memberes sich immer um ein Mitglied handelt, außer in einem privaten Kanal, wenn es sich um einen Benutzer handelt.

2 Videro Aug 15 2020 at 16:37

Sie können dies verwenden -

user = ctx.author if not user else user

Anstatt von -

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