Задать вопрос
@kaka888
C, C++, Qt, Python, Flask, aiogram, MySQL, Redis..

Как правильно спроектировать эту функцию?

Проект пишется на Python aiogram.
Есть функция show_cpanel, которая вызывается из эндпоинтов aiogram.
Есть 2 варианта реализации этой функции:
  1. Сделать единую функцию, немного заморочившись с её параметрами. Тело функции будет немного больше.
  2. Перегрузка функции с помощью декоратора overload. Тело функции будет немного меньше.


Вот эти 2 варианта:

async def show_cpanel(
    state: FSMContext,
    callback_query: Optional[CallbackQuery] = None,
    message: Optional[Message] = None,
) -> None:
    '''
    Send control panel to current user
    '''
    assert callback_query or message

    if callback_query:
        this_user = callback_query.from_user.id
        message = message or callback_query.message
    else:
        this_user = message.from_user.id
    profile_is_visible = await req.check_profile_visible(this_user)
    message_id = (await message.answer(
        '<b>' + _('Панель управления') + '</b>',
        parse_mode='HTML',
        reply_markup=kb.control_panel(profile_visible=profile_is_visible)
    )).message_id
    await state.update_data(cpanel_message_id=message_id)
    logger.info(f'Admin #{this_user} opened control panel')


или

@typing.overload
async def show_cpanel(
    state: FSMContext,
    callback_query: CallbackQuery
) -> None:
    '''
    Send control panel to current user
    '''

    this_user = callback_query.from_user.id
    profile_is_visible = await req.check_profile_visible(this_user)
    message_id = (await callback_query.message.answer(
        '<b>' + _('Панель управления') + '</b>',
        parse_mode='HTML',
        reply_markup=kb.control_panel(profile_visible=profile_is_visible)
    )).message_id
    await state.update_data(cpanel_message_id=message_id)
    logger.info(f'Admin #{this_user} opened control panel')


@typing.overload
async def show_cpanel(
    state: FSMContext,
    message: Message
) -> None:
    '''
    Send control panel to current user
    '''

    this_user = message.from_user.id
    profile_is_visible = await req.check_profile_visible(this_user)
    message_id = (await message.answer(
        '<b>' + _('Панель управления') + '</b>',
        parse_mode='HTML',
        reply_markup=kb.control_panel(profile_visible=profile_is_visible)
    )).message_id
    await state.update_data(cpanel_message_id=message_id)
    logger.info(f'Admin #{this_user} opened control panel')


Который из вариантов будет правильнее с точки зрения чистоты кода и его дальнейшей поддержки?
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

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

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