Заготовка для интерактивной консольной проги

Во первых, консоль рулит. А всякие мелкие и мягкие хомячки идут лесом. Во вторых, консоль особенно рулит, когда пишешь для себя, а не в продакшин. И в третьих, консоль рулит, ибо по нынешним временам подавляющее большинство девайсов и компов находится в сети. А «пробрасывать» консоль на удалённый терминал всё же проще (в плане разработки ПО) и легче (в плане трафика), чем GUI-шные «морды».

Бабочки, порхающие по экрану и падающие снежинки нужны только женщинам и менеджерам. А у тех, кто по настоящему занимается делом, требования к интерфейсу программ совсем иные. Ибо они брутально работу работают, а не созерцают оную. Что называется — почувствуйте разницу. Человек, согласно своей нравственности, определяет для себя систему ценностей. А выбор средств и инструментов определяется на основе сформированной системы ценностей. Сложно всё это, да и не к месту. Поэтому давайте перейдём к делу.

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

#!/usr/bin/env python3


'''
@module  preform.py
@version 0.0.0
@date    2020.02.12
@author  alex
@email   zhevak@mail.ru

@brief   Заготовка для создания консольных интерактивных программ
'''


def func_1():
    '''
    Выполняет функцию func_1
    '''
    print('Функция func_1')


def func_2():
    '''
    Выполняет функцию func_2
    '''
    print('Функция func_2')


def func_3():
    '''
    Выполняет функцию func_3
    '''
    print('Функция func_3')


def func_4():
    '''
    Выполняет функцию func_4
    '''
    print('Функция func_4')


def func_5():
    '''
    Выполняет функцию func_5
    '''
    print('Функция func_5')


def quit():
    '''
    Завершает программу
    '''
    print('Пока-пока!')
    exit()


HELP = '''
Команда     Описание действия
-------  --------------------------
  f1     Выполнить функцию func_1
  f2     Выполнить функцию func_2
  f3     Выполнить функцию func_3
  f4     Выполнить функцию func_4
  f5     Выполнить функцию func_5

  quit   Выход из программы
  help   Получение этой помощи
'''

def help():
    '''
    Выводит краткую помощь по программе
    '''
    print(HELP)
    

switch = {
  'f1': func_1,
  'f2': func_2,
  'f3': func_3,
  'f4': func_4,
  'f5': func_5,
  'quit': quit,
  'help': help
}


if __name__ == "__main__":
    '''
    '''
    while True:
        selected = input("$ ")
        switch.get(selected, lambda :
            print("Введите 'help' для получения краткой помощи по командам или 'quit' для выхода"))()
        

Для создания рабочей программы нужно наполнить функций func_1 … func_5 содержимым. При необходимости можете переименовать их и по аналогии дописать свои функции. Соответственно, тогда вам нужно будет откорректировать таблицу switch. Таблица ставит наименования пользовательских команд в соответствие с названиями функций. Таблица выполнена в виде словаря.

Например, для вызова функции func_1 пользователь должен ввести в консоли строку «f1», для выхода из программы — строку «quit» и так далее.

Инструкция

switch.get(selected, lambda :
            print("Введите 'help' для получения краткой помощи по командам или 'quit' для выхода"))()

выбирает из таблицы нужную функцию и сразу же запускает её.

В принципе можно было написать инструкцию даже так:

switch[selected]()

И это тоже будет работать. Проблема, однако, возникает тогда, когда пользователь введёт несуществующую команду. В этом случае возникает исключение (exception), которое нужно будет в программе как-то обработать. Если исключения не обрабатывать, прога будет каждый раз завершаться аварийно. Я не думаю, что вам самим понравится такое поведение.

Конечно, можно написать прогу с обработкой исключений. А можно написать и по другому. Можно и так, и так. Единого правила не существует.

Если не хочется возиться с обработкой исключений, то следует прибегнуть к методу get. У словарей имеется метод get. Метод возвращает значение по умолчанию, если в словаре нет записи с заданным ключом. Это в некоторой степени аналог метки default в операторе switch в языке С/С++, Java.

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

Конечно, можно было написать так:

def default_func():
    print("Введите 'help' для получения краткой помощи по командам или 'quit' для выхода")
...

    switch.get(selected, default_func)()

А можно и сразу в коде создать безымянную функцию и передать её в качестве результата для её запуска. Собственно, это и сделано в программе.

Как вам удобнее писать, так и пишите. Вам решать. Я лишь предлагаю варианты.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s