Discord.py, wie ctx als Standardargument übergeben wird
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
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):
ctx
ist 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 member
es sich immer um ein Mitglied handelt, außer in einem privaten Kanal, wenn es sich um einen Benutzer handelt.
Sie können dies verwenden -
user = ctx.author if not user else user
Anstatt von -
if(user == None):
user = ctx.message.author