Не конкатенируется 'FSMContextProxy' с 'int'

Я пишу бота "угадай число" для телеграма. Я хочу добавить команду choice по которой юзер будет писать любое число и бот будет загадывать свое число от 1 до числа, загаданного юзером. Но при рандомном выборе в строке t = random.randint(1, num) вылазит ошибка

return self.randrange(a, b+1)
TypeError: unsupported operand type(s) for +: 'FSMContextProxy' and 'int'

Код:

@dp.message_handler(commands=['choice'])
async def choice(message: types.Message):
    await Form.num.set()
    await bot.send_message(message.chat.id, 'Напишите целое число до которого я загадаю свое число. Примечания: введите только целое число. Введите число не менее 50, иначе победа не будет засчитана. При вводе числа >= 100 будет засчитано 2 балла.')
    
@dp.message_handler(state=Form.num)
async def num(message: types.Message, state: FSMContext):
    async with state.proxy() as num:
        num['number'] = int(message.text)
    await state.finish()
    t = random.randint(1, num)
    await bot.send_message(message.chat.id, 'Я загадал число от 1 до ' + num + '. Теперь попробуй отгадать его.')

Пробовал сделать так:

@dp.message_handler(commands=['choice'])
async def choice(message: types.Message):
    await Form.num.set()
    await bot.send_message(message.chat.id, 'Напишите целое число до которого я загадаю свое число. Примечания: введите только целое число. Введите число не менее 50, иначе победа не будет засчитана. При вводе числа >= 100 будет засчитано 2 балла.')
    global num
    async with state.proxy() as num:
        num['number'] = int(message.text)
    await state.finish()


@dp.message_handler(state=Form.num)
async def num(message: types.Message, state: FSMContext):
    t = random.randint(1, num)
    await bot.send_message(message.chat.id, 'Я загадал число от 1 до ' + num + '. Теперь попробуй отгадать его.')

Тогда ошибка

return self.randrange(a, b+1)
TypeError: unsupported operand type(s) for +: 'function' and 'int'

Если же сделать

@dp.message_handler(commands=['choice'])
async def choice(message: types.Message, state = FSMContext):
    await Form.num.set()
    await bot.send_message(message.chat.id, 'Напишите целое число до которого я загадаю свое число. Примечания: введите только целое число. Введите число не менее 50, иначе победа не будет засчитана. При вводе числа >= 100 будет засчитано 2 балла.')
    global num
    async with state.proxy() as num:
        num['number'] = int(message.text)
    await state.finish()
    t = random.randint(1, num)
    await bot.send_message(message.chat.id, 'Я загадал число от 1 до ' + num + '. Теперь попробуй отгадать его.')

Тогда

num['number'] = int(message.text)
ValueError: invalid literal for int() with base 10: '/choice'

Ответы (1 шт):

Автор решения: CrazyElf
    async with state.proxy() as num:
                                ^^^
        num['number'] = int(message.text)
        ^^^
    await state.finish()
    t = random.randint(1, num)
                          ^^^

Здесь у вас num - это то, что выдаёт state.proxy().

async def num(message: types.Message, state: FSMContext):
          ^^^
    t = random.randint(1, num)
                          ^^^

А здесь num - это название функции, начатой строкой выше.

Вы сначала назовите всё как-то по-разному: функции одними именами, переменные другими, прокси всякие назовите proxy. А то у вас несколько разных сущностей, и все они называются num. При этом питон не различает сущности по способу обращения к ним, в нём не может быть одновременно и функция и переменная с одним именем, вернее они могут быть, но их названия будут друг-друга "перекрывать" и у вас будут очень странные ошибки. Для начала разведите эти все сущности по разным осмысленным именам, а там и разберётесь, где у вас что.

→ Ссылка