Свои команды · Шаг 1 из 4
Реестр команд
Команд в утилите будет десяток, и каждая должна знать своё имя для командной строки и короткое описание для справки. Держать этот список отдельно от самих функций — верный способ однажды забыть в нём строчку.
Что сделать
Заведите реестр команд, куда каждая команда записывает себя сама, — одной строкой над функцией.
Что приходит
imya— имя команды для командной строкиopisanie— короткое описание для справки
Что вернуть
Словарь REESTR в модуле, сначала пустой; komanda(imya, opisanie) даёт декоратор, который кладёт функцию в REESTR[imya] как {"rabota": …, "opisanie": …} и возвращает её же.
Допишите функцию komanda в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Каждая команда утилиты в оболочке помечена @komanda("имя", "описание"): так она попадает в реестр, по которому шаг 4 ищет команды и строит справку. Чтобы добавить свою команду, хватит двух строк.
После двух помеченных функций — «сумма» и «привет» — в REESTR два имени в порядке регистрации: ['сумма', 'привет']. У «суммы» описание «сложить числа», а REESTR['сумма']['rabota'](2, 3) возвращает 5 — это та же функция summa.
В модуле заводится словарь «REESTR» — имя команды в словарь с двумя ключами: «rabota» (сама функция) и «opisanie» (строка). В начале он пуст.
Функция «komanda» принимает имя и описание и возвращает декоратор. Декоратор записывает функцию в реестр под этим именем и возвращает её БЕЗ ИЗМЕНЕНИЙ: вызов декорированной функции ничем не отличается от вызова исходной, и это та же самая функция, а не похожая.
Повторная регистрация того же имени заменяет запись. Порядок имён в реестре — порядок, в котором их регистрировали.
Образцовый тест целиком
@komanda("сумма", "сложить числа")
def summa(*chisla):
return sum(chisla)
@komanda("привет", "поздороваться")
def privet(kto="мир"):
return f"привет, {kto}"
(list(REESTR), REESTR['сумма']['opisanie'], REESTR['сумма']['rabota'](2, 3))
(['сумма', 'привет'], 'сложить числа', 5)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.