Discord.py jak przekazać ctx jako domyślny argument

Aug 15 2020

Piszę polecenie profilu za pomocą Discord.py, które wyświetla informacje o określonym użytkowniku.

Chciałbym podać autora wiadomości jako domyślny argument, więc jeśli użytkownik tylko napisze polecenie i nic więcej, bot wyśle ​​swój profil.

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

Powyższy kod nie działa. Pojawia się następujący błąd:

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

Czy ktoś może mi powiedzieć, co robię źle i jak sprawić, by mój kod działał?

EDYTOWAĆ:

W pewnym sensie ominąłem problem z:

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

Moje pytanie wciąż pozostaje, czy istnieje sposób na przekazanie ctx jako domyślnego argumentu?

Odpowiedzi

1 fixmycode Aug 15 2020 at 16:39

Krótka odpowiedź jest taka, że ​​nie możesz tego zrobić, ponieważ zmieniłbyś podpis funkcji. Polecenia są wywoływane z oczekiwaniem na ten podpis:

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

ctxnie jest podaną wartością, a jedynie nazwą pierwszego parametru. Nie możesz zakładać, do czego ma służyć.

To, co możesz zrobić, to założyć liczbę parametrów, postępując zgodnie z przykładem w dokumentacji discord.py, możesz zrobić coś takiego:

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

W tym kodzie możesz założyć, że memberjest to zawsze członek, z wyjątkiem kanału prywatnego, kiedy to byłby użytkownik.

2 Videro Aug 15 2020 at 16:37

możesz tego użyć -

user = ctx.author if not user else user

zamiast -

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