Generator losowych historii B: Projektu Domowego
Pięć niezależnych losowych wyborów wypełnia wzór – a opcjonalny random.Random sprawia, że wynik jest powtarzalny w testach.
Generator wypełnia szablon zdania losowo wybranymi słowami z kilku listy. Wszystkie rzeczowniki na liście są męskie, więc zgadza się z Przymiotniki nie są naruszane w żadnej kombinacji:
PRILAGATELNYE = [„odważny”, „ciekawski”, „roztargniony”, „zabawne”, „tajemniczy”]
SUSHESTVITELNYE = [„smok”, „programista”, „kot”, „podróżnik”, „robot”]
MESTA = [„W Mrocznym Lesie”, „Na odległej planecie”, „w starej bibliotece”, „w piwnicy domu”]
GLAGOLY = [„znalezione”, „zgubił", „naprawił”, „wynaleziony”, „ukrył”]
PREDMETY = [„magiczny laptop”, „Starożytny Zwój”, „Zepsuty kompas”, „Słoik dżemu”]
SHABLON = (
„Dawno, dawno temu {prilagatelnoe} {sushestvitelnoe} {mesto} {glagol} {predmet}. ”
„Jego życie od tamtej pory nigdy nie było takie samo.”
)
Testowalna losowość
Jeśli sluchajnaya_istoriya() zawsze odnosi się bezpośrednio do
Globalny stan modułu random, test może sprawdzić
Efekt, tylko poprzez wstępne zasiewanie tego globalnego stanu, jest kruchym sposobem, łatwym
łamiący, jeśli gdzieś indziej w programie jest też wywołane random
. Zamiast tego funkcja przyjmuje opcjonalny generator liczb losowych:
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) tworzy osobny generator liczb losowych, który nie jest powiązany z globalnym stanem modułu random. Dwie kopie random.Random(7)utworzone niezależnie zawsze generują tę samą sekwencję — na tym opiera się test deterministyczny: sluchajnaya_istoriya(random.Random(7))przywołany dwa razy z nowym generatorem dla tego samego ziarna, za każdym razem zwróci tę samą historię.Pełny kod: projects/console/story-generator/story_generator.py
Quest
Dodaj lista PRZYSŁÓWKÓW (np. "nagle", "przypadkowo", "niezauważalnie") i wstaw {narechie} do szablonu, zachowując zgodność płci.
Issue „Add random story generator” feat/story-generator,
Test deterministyczny z ustalonym testem random.Random
, Pull Request.