Свои команды · Шаг 4 из 4
Справка, поиск и запуск
Последний шаг связывает всё вместе: он смотрит в реестр, отвечает на «помощь», по-человечески объясняется на опечатку в имени команды — и только потом зовёт саму команду.
Что сделать
Свяжите утилиту воедино — справка, подсказка на опечатку и запуск команды.
Что приходит
reestr— реестр команд, как в шаге 1imya— имя командыdovody— список позиционных аргументовimenovannye— словарь именованных аргументов
Что вернуть
Строку для человека: пустое имя или «помощь» — справка; имени нет в реестре — «нет команды «…»» с подсказкой похожего; иначе — результат команды строкой.
Допишите функцию vypolnit в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Утилита печатает то, что вернула vypolnit. Решите шаг — и она начнёт отвечать на «помощь», угадывать опечатки и запускать команды.
В реестре три команды: «время», «сумма», «пароль». На «помощь» функция возвращает справку — строку «Команды:» и по строке на команду: имя, выровненное по самому длинному, тире и описание.
В проверке команды реестра — короткие подмены на lambda: «время» всегда отвечает «полдень».
Функция принимает реестр (словарь, как в первом шаге), имя команды, список позиционных аргументов и словарь именованных. Возвращает строку — то, что будет напечатано человеку.
Пустое имя или «помощь» — возвращается справка. Это строка «Команды:», а дальше по строке на команду, в порядке реестра: два пробела, имя, дополненное пробелами справа до ширины самого длинного имени, пробел, тире, пробел, описание. Пустой реестр даёт «Команд нет».
Имя, которого в реестре нет, — «нет команды «сума»». Если похожее имя в реестре есть, к сообщению через пробел добавляется «Может быть, «сумма»?» — самое похожее по difflib.get_close_matches.
Иначе вызывается функция из реестра со всеми аргументами, а её результат возвращается строкой.
Образцовый тест целиком
reestr = {
"время": {"rabota": lambda: "полдень", "opisanie": "что сейчас на часах"},
"сумма": {"rabota": lambda *chisla: sum(chisla), "opisanie": "сложить числа"},
"пароль": {"rabota": lambda dlina=8: "х" * dlina, "opisanie": "придумать пароль"},
}
vypolnit(reestr, 'помощь', [], {})
'Команды:\n время — что сейчас на часах\n сумма — сложить числа\n пароль — придумать пароль'
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.