@daniil-orlovv
Junior Python-developer

Как убрать ошибку TypeError: 'coroutine' object is not subscriptable?

Как правильно изменить код, чтобы не было ошибки. Примерно понимаю суть, но не понимаю, как это решит:

TypeError: 'coroutine' object is not subscriptable
Traceback (most recent call last):
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 309, in _process_
update
    response = await self.feed_update(bot, update, **kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 158, in feed_upda
te
    response = await self.update.wrap_outer_middleware(
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\middlewares\error.py", line 25, in __c
all__
    return await handler(event, data)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\middlewares\user_context.py", line 27,
 in __call__
    return await handler(event, data)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\fsm\middleware.py", line 41, in __call__
    return await handler(event, data)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\event\telegram.py", line 121, in trigg
er
    return await wrapped_inner(event, kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\event\handler.py", line 43, in call
    return await wrapped()
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 276, in _listen_u
pdate
    return await self.propagate_event(update_type=update_type, event=event, **kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\router.py", line 128, in propagate_eve
nt
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\router.py", line 123, in _wrapped
    return await self._propagate_event(
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\router.py", line 148, in _propagate_ev
ent
    response = await observer.trigger(event, **kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\event\telegram.py", line 113, in trigg
er
    result, data = await handler.check(event, **kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\event\handler.py", line 94, in check
    check = await event_filter.call(*args, **kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\venv\lib\site-packages\aiogram\dispatcher\event\handler.py", line 48, in call
    return await loop.run_in_executor(None, wrapped)
  File "C:\Users\Даниил\AppData\Local\Programs\Python\Python39\lib\concurrent\futures\thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\bot.py", line 151, in <lambda>
    lambda callback, state: check_date_for_staff(callback.data, state)
  File "C:\Users\Даниил\Desktop\Телеграм Бот\Telegram_bot\utils.py", line 11, in check_date_for_staff
    staff_id = state_data['staff']


Есть вызов асинхронной функции `check_freee_services_for_staff` без применения `await` внутри `lambda-функции`:

@dp.callback_query(
        StateFilter(SignUpFSM.service),
        lambda callback, state: check_free_services_for_staff(
            callback, state, get_free_services)
)
async def send_choose_date(callback: types.CallbackQuery, state: FSMContext):

    print(f'{callback.from_user.full_name} выбрал услугу: {callback.data}')
    await state.update_data(service=callback.data)
    state_data = await state.get_data()
    staff_id = state_data['staff']

    await callback.message.answer(
        text=(f'Ваш мастер: {staff_id}\n'
              f'Ваша услуга: {callback.data}\n\n'
              f'Выбери дату:')
    )

    free_days = get_free_date(staff_id)
    adjust = (1, 7, 7, 7, 7, 7)
    for i in range(0, len(free_days)):
        month_number = str(list(free_days.keys())[i])
        days = free_days.get(month_number)
        params = (month_number, days)
        keyboard_date = create_inline_kb(adjust, 'date', *params)

        await callback.message.answer(
            text='Выбери дату:',
            reply_markup=keyboard_date
        )
        await state.set_state(SignUpFSM.date)


Вот сама функция:

async def check_free_services_for_staff(callback, state, api):

    state_data = await state.get_data()
    staffs = state_data['staff']
    free_staffs = api(staffs)
    return callback.data in free_staffs


Но вызывать функцию внутри lambda-функции с применением `await` не получается. Как правильно изменить код?
  • Вопрос задан
  • 552 просмотра
Решения вопроса 1
febday
@febday
Ну вы же сами понимаете, что вызывать асинхронную функцию в лямбда-функции нельзя, тогда зачем вы вообще это передаёте?
Если вам это всё таки нужно как-то проверить или что-то ещё, то сделайте для этого отдельный aiogram фильтр
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы