Использование нескольких значений для одного параметра в команде в discord.py

#python #discord #discord.py

Вопрос:

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

 @client.command()
async def ask1(ctx , q):
    quiz_data = {
        'question1' : (["1" , "one"] , "one") , 
        'question2' : (["2" , "two"] , "two") , 
    }

    questionp1 = random.choice(list(quiz_data.keys()))
    answersp1 , hintp1 = quiz_data[questionp1]

    quiz_data1 = {
        'question3' : (["3" , "three"] , "three") , 
        'question4' : (["4" , "four"] , "four")
    }

    questionp2 = random.choice(list(quiz_data1.keys()))
    answersp2 , hintp2 = quiz_data1[questionp2]

    global var
    if var == 0:
        var = 1
        if q == "1":
            await ctx.send("What is the answer to this question?")
            await asyncio.sleep(1)
            await ctx.send(questionp1)

            def check_sender(msg):
                return msg.channel == ctx.channel
            def check_answer(msg):
                return any(answer in msg.content.lower() for answer in answersp1)

            try:
                async with timeout(10):
                    while var == 1:
                        msg = await client.wait_for('message', check=check_sender)
                        if check_answer(msg):
                            await ctx.send("Well done.")
                            var = 0                     
                            break
                        else:
                            print(msg.content)
            except asyncio.TimeoutError:
                if var != 1:
                    var = 0
                else:
                    await ctx.send(f"What is the answer to this question? hint: {hintp1}")
                    await ctx.send(questionp1)

                    try:
                        async with timeout(5):
                            while var == 1:
                                msg = await client.wait_for('message', check=check_sender)
                                if check_answer(msg):
                                    await ctx.send("Well done.")
                                    var = 0
                                    break
                                else:
                                    print(msg.content)
                    except asyncio.TimeoutError:
                        await ctx.send("No one got it right.")
                        var = 0
        elif q == "2":
            await ctx.send("What is the answer to this question?")
            await asyncio.sleep(1)
            await ctx.send(questionp2)

            def check_sender(msg):
                return msg.channel == ctx.channel
            def check_answer(msg):
                return any(answer in msg.content.lower() for answer in answersp2)

            try:
                async with timeout(10):
                    while var == 1:
                        msg = await client.wait_for('message', check=check_sender)
                        if check_answer(msg):
                            await ctx.send("Well done.")
                            var = 0                     
                            break
                        else:
                            print(msg.content)
            except asyncio.TimeoutError:
                if var != 1:
                    var = 0
                else:
                    await ctx.send(f"What is the answer to this question? hint: {hintp2}")
                    await ctx.send(questionp2)

                    try:
                        async with timeout(5):
                            while var == 1:
                                msg = await client.wait_for('message', check=check_sender)
                                if check_answer(msg):
                                    await ctx.send("Well done.")
                                    var = 0
                                    break
                                else:
                                    print(msg.content)
                    except asyncio.TimeoutError:
                        await ctx.send("No one got it right.")
                        var = 0
    else:
        await ctx.send("A round has already begun.")
 

Это концепция, которую я сейчас использую. Команда $ask1 1 и $ask1 2 работает нормально, но я хочу, чтобы у пользователя был выбор поставить $ask1 q:1,2 или что-то в этом роде, после чего бот вытаскивает вопрос либо из первого набора quizdata, либо из второго. Обратите внимание, что весь этот код работает хорошо и выполняется без каких-либо ошибок. Я ломал голову в течение нескольких дней, и я думаю, что для этого мне следует использовать ключевые слова вместо позиционных аргументов, но я не совсем уверен и не знаю, как правильно применять концепцию кваргов в этой ситуации. То var s необходимы для другой команды, кстати, команды «стоп», поэтому вам не нужно обращать на это внимание.

Извините, если это трудно понять, я буду готов ответить на любые вопросы, чтобы сделать это более понятным. Любой ответ будет оценен по достоинству, спасибо!

Ответ №1:

Вы можете просто использовать произвольную библиотеку,вот документация https://docs.python.org/3/library/random.html. То, о чем я думал, вы могли бы сначала сгенерировать случайное число от 1 до 2, если случайное число равно 1, вы бы перешли к данным викторины, если 2-к данным викторины2, а затем сгенерировали другое случайное число от 1 до, и это указывало бы, какой вопрос из этих данных викторины будет использоваться

Комментарии:

1. Спасибо @SimonTheAnt, но я не уверен, что мы здесь на одной странице. Я думаю, что понимаю, о чем вы говорите, но я не вижу, как пользователь сможет использовать $ask1 q:1,2 или что-то подобное, поскольку ваш ответ касается только части случайных вариантов в данных. Я не уверен, что я тот, кто ошибается, но я думаю, что у меня уже есть эта концепция в моем коде. Спасибо за ваш ответ, хотя я ценю это~