12.13 Оператор сопоставления и перекрёстное тестирование
TODO
рассказ про match/case, с постепенным усложнением шаблона. Очередное усложнение шаблона сопровождается соответствующим упражнением.
- Упражнения на match/case.
- ВНИМАНИЕ - при реализации обязательно использование оператора match/case, а не цепочек if-ов.
- в рамках упражнений необходимо ДОстраивать парсер некоторого командного языка, т.е. наращивать набор поддерживаемых команд.
командный язык построен по мотивам multi-user dungeon - текстовой бродилки с интерфейсом командной строки.
- основной цикл программы-упражнения выглядит так:
- ввод команды (как текстовой строки)
- разбор команды через match/case и "выполнение" команды
простейшие команды.
набор команд: about, credits [--year], quit
- выполнение команд:
about: вывод "MUD version 0.01"
credits (без ключа): вывод "Copyright (c) developers"
credits --year: вывод "Copyright (c) developers THIS YEAR"
quit: выход из программы
- прочие (неподдерживаемые) команды: вывод "Cannot parse"
команда с параметром, разбор через связанную переменную.
команда: move <направление>, варианты направления: left, right
- разбирать через вложенный match/case, на втором уровне анализируется связанная переменная с первого уровня
- выполнение команды:
move left: вывод "<-moved"
move right: вывод "moved->"
move с другим параметром или без параметров: вывод "Unknown movement direction"
команда с цепочкой аргументов, разбор через список параметров (*parameters)
команда: travel <направление> [<направление> ...], направления как в move
- выполнение команды: проход по списку параметров; в зависимости от значения параметра:
DIR.LEFT: вывод "<-traveled"
DIR.RIGHT: вывод "traveled->"
- другое значение: вывод "Unknown travel direction"
DIR.LEFT, DIR.RIGHT - константы со значениями, соответственно, "left" и "right"
- если список параметров пуст: вывод "Nowhere to travel"
matching экземпляров пользовательского класса
- ОТДЕЛЬНАЯ программа, не расширение предыдущего match/case
- добавим немного магии
напишите класс Spell с полями type и strength
напишите оператор match/case для объекта класса Spell, со следующими ветками:
type - любой, strength=0: вывод "Some spell of zero strength"
type="lightning" или type="fireball", strength - любой:
для type="lightning": вывод "Electric damage of <strength> hit points"
для type="fireball" : вывод "Fire damage of <strength> hit points"
в остальных случаях: вывод "Unknown spell of type <type>, use magic with care!"
TODO:
- + словарь (опц)
MUD!!!
Тестирование
Скачать pyjudge
- Разбираемся на пары, выбираем готовое решение Д/З и проверяем
Оформляем файл URLS в репозитории
Д/З
Убедиться, что для всех Д/З, начиная с 09.13 имеются работающие тесты
Ко всем задачам (если это не оговорено отдельно) подобрать среди зарегистрированных репозиториев три каталога с тестами, которые
В каталог с решением каждой задачи положить файл URLS, в котором должно быть три таких URL, пол одному в строке
Пример для GitHub: https://github.com/Veniamin-Arefev/pythonprac-2021/tree/main/20211111/2/tests
Пример для GitLab: https://git.cs.msu.ru/s02190248/pythonprac/-/tree/main/20211111/2/tests