Discord.py как передать ctx в качестве аргумента по умолчанию

Aug 15 2020

Я пишу команду профиля с помощью Discord.py, которая распечатывает информацию об указанном пользователе.

Я хотел бы передать автора сообщения в качестве аргумента по умолчанию, поэтому, если пользователь просто напишет команду и ничего больше, бот отправит их профиль.

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

Приведенный выше код не работает. Он выдает следующую ошибку:

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

Может ли кто-нибудь сказать мне, что я делаю не так и как заставить мой код работать?

РЕДАКТИРОВАТЬ:

Я как бы обошел проблему с:

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

Мой вопрос все еще остается, есть ли способ передать ctx в качестве аргумента по умолчанию?

Ответы

1 fixmycode Aug 15 2020 at 16:39

Короткий ответ: вы не можете этого сделать, так как вы измените подпись функции. Команды вызываются с ожиданием этой подписи:

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

ctxне является заданным значением, а просто именем первого параметра. Вы не можете делать предположений о том, что будет использоваться.

Что вы можете сделать, это предположить количество параметров, следуя примеру из документации discord.py, вы можете сделать что-то вроде этого:

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

В этом коде вы можете предположить, memberчто всегда является участником, за исключением частного канала, когда это будет пользователь.

2 Videro Aug 15 2020 at 16:37

вы можете использовать это -

user = ctx.author if not user else user

вместо -

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