Как на python3 сделать аналог cmd?

Добрый день!
Подскажите как удобней всего реализовать подобие командной строки для управления своим приложением?
К примеру a = input() человек вводит команду read 2017 admin и в функцию read передается значение 2017 и admin
В голову только пришло использовать кучу if'ов и парсить строку.
Может быть существует способ более простой реализации?
  • Вопрос задан
  • 665 просмотров
Решения вопроса 1
@javedimka
Хочу сока
Используй словарь.
На твоем же примере read 2017 admin
Функции в примере просто будут выводить все переданные аргументы:
def create(*args):
    print("'Create' Function with given args:")
    for arg in args:
        print('%8s' % (arg))


def read(*args):
    print("'Read' Function with given args:")
    for arg in args:
        print('%8s' % (arg))


def update(*args):
    print("'Update' Function with given args:")
    for arg in args:
        print('%8s' % (arg))


def delete(*args):
    print("'Delete' Function with given args:")
    for arg in args:
        print('%8s' % (arg))

# Словарь с функциями. Ключом является вводимая команда.
options = {"create": create,  "read": read, "update": update, "delete": delete}

# Входим в бесконечный цикл, программа не будет завершаться после выполнения
# первой же введенной команды.
while True:
    # Получаем строку от пользователя и разбиваем по пробелам в список.
    # Если user input = read 2017 admin, то получим ['read', '2017', 'admin'].
    command = input("command? ->").split()
    # Используем метод словаря .get() для получения функции
    # связанной с введенной командой, записываем ее в переменную option.
    option = options.get(command[0])  # command[0] - операция индексации списка.
    # Проверяем удалось ли получить функцию связанную с командой пользователя.
    if option:
        # Если удалось, то вызываем функцию с аргументами полученными с помощью
        # операции извлечения среза и распаковки списка в отдельные аргументы.
        option(*command[1:])


Вывод :
command? ->read 2017 admin
'Read' Function with given args:
    2017
   admin
command? ->


Бонусом небольшое объяснение про звездочку.

Инструкция * в зависимости от того где она находится делает разные вещи(помимо умножения):

В строке с объявлением функции ( def create(*args): ) она позволяет "запаковать" все переданные функции аргументы в один кортеж args. То есть нет необходимости указывать какие именно позиционные аргументы ожидает получить функция, можно передать любое их количество (нуль и более).

В строке с вызовом функции ( option(*command[1:]) ) она позволяет "распаковать" все элементы последовательности в отдельные позиционные аргументы. То есть все объекты в указанной последовательности command[1:] будут передаваться в функцию как отдельные позиционные аргументы.

В примере сверху если предварительно не распаковать command[1:] в отдельные аргументы, звездочка запакует в кортеж args целый список, т.е. получим (['2017', 'admin']) - кортеж с одним объектом внутри, что сломает наши функции, придется дополнить цикл тремя лишними символами для их работоспособности (добавить индексацию кортежа: for arg in args[0]). Если же распаковать, то получим кортеж с двумя объектами внутри, что позволит напрямую пройтись в цикле по кортежу.

Больше информации про распаковку аргументов, индексацию списка и извлечению срезов можно найти в гугле. ( Например про родственника звездочки * двойную звездочку ** которая помогает в работе с именованными аргументами)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
@alex-t
Прогр. в команде rco.ru
Если вводящий человек знаком с питоном - можно просто ввести структуру, например:
[11, 'qwerty', {'a': 15, 'b':33}]
а в программе превратить текст в питон-данные с помощью ast.literal_eval()
Если незнаком - лучше просто вводить отдельными input'ами каждый фрагмент.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы