Домашний проект B: генератор случайных историй
Пять независимых случайных выборов заполняют шаблон — а необязательный random.Random делает результат воспроизводимым в тестах.
Генератор заполняет шаблон предложения случайно выбранными словами из нескольких списков. Все существительные в списке — мужского рода, поэтому согласование с прилагательными не нарушается ни при каком сочетании:
PRILAGATELNYE = ["храбрый", "любопытный", "рассеянный", "весёлый", "загадочный"]
SUSHESTVITELNYE = ["дракон", "программист", "кот", "путешественник", "робот"]
MESTA = ["в тёмном лесу", "на далёкой планете", "в старой библиотеке", "в подвале дома"]
GLAGOLY = ["нашёл", "потерял", "починил", "изобрёл", "спрятал"]
PREDMETY = ["волшебный ноутбук", "древний свиток", "сломанный компас", "банку варенья"]
SHABLON = (
"Однажды {prilagatelnoe} {sushestvitelnoe} {mesto} {glagol} {predmet}. "
"С тех пор жизнь его больше не была прежней."
)
Проверяемая случайность
Если sluchajnaya_istoriya() всегда обращается напрямую к
глобальному состоянию модуля random, тест может проверить
результат, только предварительно засеяв это глобальное состояние — хрупкий способ, легко
ломающийся, если где-то ещё в программе тоже вызывается random
. Вместо этого функция принимает необязательный генератор случайных чисел:
def sluchajnaya_istoriya(rng: random.Random | None = None) -> str:
generator = rng if rng is not None else random
return SHABLON.format(
prilagatelnoe=generator.choice(PRILAGATELNYE),
sushestvitelnoe=generator.choice(SUSHESTVITELNYE),
mesto=generator.choice(MESTA),
glagol=generator.choice(GLAGOLY),
predmet=generator.choice(PREDMETY),
)
random.Random(1) создаёт отдельный генератор случайных чисел, не связанный с глобальным состоянием модуля random. Два экземпляра random.Random(7), созданные независимо, всегда выдают одну и ту же последовательность — на этом и строится детерминированный тест: sluchajnaya_istoriya(random.Random(7)), вызванная дважды с новым генератором на то же зерно, оба раза вернёт одну и ту же историю.Полный код: projects/console/story-generator/story_generator.py
Задание
Добавьте список НАРЕЧИЯ (например, «внезапно», «случайно», «незаметно») и вставьте {narechie} в шаблон, сохранив согласование по роду.
Issue «Add random story generator», ветка feat/story-generator,
тест на детерминированный результат с фиксированным random.Random
, Pull Request.