Как реализовать командную оболочку на Python?

Discussion in 'Python' started by FK-, 17 Mar 2019.

  1. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    8
    Reputations:
    0
    Если нет желание углубляться в детали:
    Хочу написать ф-цию, которая на вход будет принимать строку, обрабатывать её и в зависимости от результата обрабоки вызывать конкретную функцию с конкретными аргументами. То, что уже делал - описал в подробностях в спойлере.
    Как бы вы реализовали командную оболочку ?
    Я пишу консольное приложение, которое выводит в консоль погоду в определённом городе.
    Есть класс готовый класс weather, в котором реализовано создание нового экземпляра (метод __init__)
    1. отправка запроса к api
    2. обработка ответа, учитывая код статуса ответа
    3. инициализирование переменных экземпляра данными, полученными из запроса
    Я хочу написать командную оболочку, которую было бы удобно масштабировать под любой другой проект, но в данном случае под класс. Методы класса будут дописываться --> команды в оболочку будут добавляться.
    Через эту оболочку должны вызываться другие ф-ции или методы класса конкретно в данном случае.

    Возможно, я неправильно использую терминологию - под оболочкой я подразумеваю такую функцию, которая в бесконечном цикле считывает строку, пока не встретит команду выхода из программы и будет вызвана ф-ция quit().
    Считав строку, функция пытается интерпретировать её как команду и аргументы.
    Далее вызывается нужная функция с данными аргументами.

    Я делал это вот так:
    Code:
    #Это кусок из этой же программы, только другой версии
    lang = None
    
    def command():
        global lang
        com = input('>>> ').split()
        if com[0] == 'quit':
            quit()
        elif com[0] == 'current':
            for i in range(2, len(com)):
                com[1] = com[1] + ' ' + com[i]
            current(com[1], lang)
        elif com[0] == 'lang':
            lang = com[1]
        else:
            print('Invalid command')
    Имхо, такой метод (когда ф-ция последовательно проверяет условие) можно применять при построении любой простой оболочки. Но он просто ужасен и его неудобно масштабировать.

    Я подумал, что можно это реализовать примерно вот так
    Code:
    d = {'com1' = func1(), 'com2': func2()}
    
    def command():
        global d
        com = input('>>> ')
        #манимуляции
        return d.get(com, 'Invalid command')
    То есть сначала определяется словарь {'имя команды': функция}
    отдельно пишутся все функции
    так же, как и в первом варианте - строка считывается и из неё нужно вытащить ключевые слова, которые будут аргументами com и остальными аргументами, нужными для конкретной функции.
    Но если подумать, то это тоже достаточно сложно и требует доработок, тк в именно таком виде функции внутри словаря не работают.

    Ну и что я в результате хочу спросить:
    - как бы вы реализовывали командную оболочку ?
    - что вы думаете по поводу варианта со словарём ?
     
  2. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    8
    Reputations:
    0
  3. barnaki

    barnaki Level 8

    Joined:
    2 Nov 2008
    Messages:
    673
    Likes Received:
    115
    Reputations:
    4
    #3 barnaki, 29 Mar 2019
    Last edited: 29 Mar 2019
    FK- likes this.
  4. FK-

    FK- Member

    Joined:
    25 Dec 2018
    Messages:
    31
    Likes Received:
    8
    Reputations:
    0
    Спасибо)
    Да, по шаблонам мне нужно подтянуться