Использование рекурсии в асинхронных функциях

#python #recursion #async-await #discord.py #bots

Вопрос:

У моего бота Discord есть start команда, в которой я проверяю, находится ли пользователь уже в моей базе данных, и если нет (запуск start команды в первый раз) Я хочу добавить этого пользователя в свою базу данных.

Вот идея, которую я попробовал:

 client = commands.Bot(command_prefix = '/')  # define commands @client.command() async def start(ctx):  await start_command(ctx)   async def start_command(ctx):   user_id : int = ctx.message.author.id   result : int = does_user_exist(user_id) # returns 0 if no entry in database   if (result == 0):  print('Create user')  create_user(user_id)  await start_command(ctx)  else:  welcome_message = 'Welcome!'  await ctx.send(welcome_message)  

Моя идея здесь состояла в том, чтобы проверить, зарегистрирован ли пользователь уже (=запись в моей базе данных). Если да, то сообщение будет отправлено. Чтобы избежать /start повторного запуска, я попытался использовать рекурсию.

Моя проблема в том случае, если пользователь еще не существует. Пользователь создается с create_user(user_id) помощью , но рекурсия работает не так, как я ожидал. В этом случае мне нужно запустить /start второй раз, прежде чем мое сообщение будет отправлено ботом.

(вот почему я знаю, что пользователь был создан, иначе /start при повторном запуске мое сообщение не отобразилось бы

Как бы я достиг своей цели, используя рекурсию?

Ответ №1:

Не используйте рекурсию для реализации цикла, точка.

 async def start_command(ctx):   user_id : int = ctx.message.author.id   while True:  result : int = does_user_exist(user_id)  if result != 0:  break   print('Create user')  create_user(user_id)    welcome_message = 'Welcome!'  await ctx.send(welcome_message)  

В зависимости от того, насколько это надежно create_user , вам вообще не понадобится петля.

 async def start_command(ctx):   user_id : int = ctx.message.author.id   result : int = does_user_exist(user_id)  if result == 0:   print('Create user')  create_user(user_id)    welcome_message = 'Welcome!'  await ctx.send(welcome_message)