Консольное приложение Python | Есть ли лучший способ вернуться на страницу?

У меня есть система для возврата к ранее посещенной странице в консольном приложении Python; он работает достаточно хорошо, но я чувствую, что может быть красивее способ сделать это. Есть ли у кого-нибудь предложения по улучшению того, что у меня ниже?

def main():
    try:
        while True:
            print('Main Menun')

            option = input('page 1, page 2, quitn')

            if option in ['1', 'one']:
                menu_stack.append(0)
                page_one()
            elif option in ['2', 'two']:
                menu_stack.append(0)
                page_two()
            elif option in ['q', 'quit']:
                quit()
            else:
                print('Invalid input, please try againn')
                sleep(1)

    except KeyboardInterrupt:
        quit()

Очень похоже на страницу главного меню, ниже — страница 1:

def page_one():
    while True:
        clear_terminal()

        print('Page Onen')

        option = input('Page 2, backn')

        if option in ['2', 'two']:
            menu_stack.append(1)
            page_two()
        elif option in ['b', 'back']:
            menu_checker()
        else:
            print('Invalid input, please try againn')
            sleep(1)

menu_checker() вызывает другие страницы в зависимости от того, что появляется из стека:

def menu_checker():
    page = menu_stack.pop()

    if page == 1:
        page_one()
    elif page == 2:
        page_two()
    elif page == 0:
        main()
    else:
        print('Error')

Есть ли у кого-нибудь лучшие идеи / решения? Хотя это не вызывает никаких проблем (насколько мне известно), я чувствую, что то, что у меня есть, довольно неуклюже и может быть улучшено.

1 ответ
1

Я думаю, вы можете воспользоваться несколькими разными подходами.

Стек был внутри вас все время

Возможно, это не самый гибкий подход, но в настоящее время ваши страницы — это просто функции. И угадайте, что? В вашей программе уже есть стек функций — вы перемещаетесь по нему, вызывая функции и returnот них! Вы не получите много информации о том, где вы окажетесь, если вернетесь, но если это не проблема, вы можете просто избавиться от menu_checker и menu_stack в целом — если пользователь хочет вернуться, вы просто return.

Например, ваш page_one может просто выглядеть как

def page_one():
    while True:
        clear_terminal()

        print('Page Onen')

        option = input('Page 2, backn')

        if option in ['2', 'two']:
            page_two()
        elif option in ['b', 'back']:
            return
        else:
            print('Invalid input, please try againn')
            sleep(1)

Возможно, это не самый модный вариант, но его легко реализовать, легко понять и он отлично справляется со своей задачей.

Куда ты хочешь пойти?

Но, может быть, этого недостаточно. Было бы неплохо, если бы опция «назад» могла сказать что-то вроде «Назад (к странице 1)», например, в зависимости от того, как выглядит стек. Или, может быть, вы хотели бы также иметь опцию «вперед» на случай, если пользователь случайно нажмет «назад» слишком много раз. Или, может быть, есть еще одна причина, по которой вы не хотите использовать для этого стек вызовов. Это тоже нормально.

Другой вариант — переместить логику навигации из отдельных меню в один основной цикл. Затем каждое меню возвращает то меню, в которое, по его мнению, вам следует перейти.

Например, мы могли бы смотреть на что-то вроде этого:

def main():
    menu_stack = [main_menu]

    while menu_stack:
        current_menu = menu_stack[-1]

        next = current_menu.get_next_menu(option)

        if next:
            menu_stack.append(next)
        else:
            menu_stack.pop()

Меню очень похоже на предыдущие, но вместо того, чтобы вызывать следующее меню, как page_two() они возвращают это как return page_two. Или возможно return None если мы должны вернуться.

Классный

Лично я считаю, что есть некоторые задачи (например, запрос ввода), за которые должно отвечать само приложение, а не меню. Меню может знать, как оно выглядит и как перемещаться на основе ввода, но основной цикл запрашивает у него помощь, а затем обрабатывает эти вещи на своих условиях.

def main():
    menu_stack = [main_menu]

    while menu_stack:
        current_menu = menu_stack[-1]

        clear_terminal()

        print(current_menu.text)

        option = input(current_menu.prompt)

        try:
            next = current_menu.get_next_menu(option)

            if next:
                menu_stack.append(next)
            else:
                menu_stack.pop()
        except ValueError as e:
            print("Invalid input, please try again")
            sleep(1)

Определение красивого класса Menu оставлено читателю в качестве упражнения.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *