Wczytywanie konfiguracji
Moduł łącza czyta ustawienia z pliku JSON, który operatorzy edytują ręcznie. W zeszłym tygodniu ktoś wpisał "256" w cudzysłowie, przekręcił klucz i ustawił dwanaście ponowień, a moduł bez słowa wystartował ze złymi ustawieniami.
Napisz moduł wczytujący, który uzupełnia to, czego brakuje, sprawdza to, co jest, i wymienia każdy problem, zanim cokolwiek wystartuje.
Ukończ etap 1, aby odblokować ten etap.
Wczytaj settings_text przez json.loads(). Zacznij config od kopii DEFAULTS, uzupełnij ją tym, co zapisano, i wypisz każde ustawienie w kolejności nazw, z wartością zapisaną jako JSON:
downlink_rate_kbps = "256" log_level = "INFO" log_levl = "DEBUG" retries = 12 safe_mode = "yes" timeout_s = 2.5
dict(DEFAULTS) tworzy kopię, a update() ją uzupełnia. json.dumps(value) pokazuje różnicę między "256" a 256.
Ukończ etap 1, aby odblokować ten etap.
Sprawdź każde zapisane ustawienie, w kolejności zapisu, i zbierz komunikat dla każdego problemu: nieznanej nazwy, ustawienia liczbowego, które nie jest liczbą albo wychodzi poza zakres z RANGES, safe_mode, które nie jest true ani false, log_level spoza LOG_LEVELS. Po konfiguracji wypisz je wszystkie albo Konfiguracja OK:
Problemy: 4 downlink_rate_kbps: musi być liczbą, a jest str retries: 12 jest poza zakresem od 0 do 10 safe_mode: musi być true albo false, a jest str log_levl: nieznane ustawienie
True to w Pythonie także int, więc najpierw wyklucz bool: isinstance(value, bool) or not isinstance(value, (int, float)).
Ukończ etap 2, aby odblokować ten etap.
Przenieś pracę do load_config(text), która zwraca (config, problems) i nigdy się nie wysypuje. Tekst, który nie jest poprawnym JSON-em, to jeden problem, to nie jest poprawny JSON: i msg błędu; JSON, który nie jest obiektem, na przykład lista, to też jeden problem. W obu przypadkach config to kopia wartości domyślnych. Do konfiguracji trafiają tylko ustawienia, które przeszły sprawdzenie; pozostałe zachowują wartości domyślne. Uruchom ją dla wszystkich trzech tekstów:
settings_text: downlink_rate_kbps: musi być liczbą, a jest str retries: 12 jest poza zakresem od 0 do 10 safe_mode: musi być true albo false, a jest str log_levl: nieznane ustawienie good_text: Konfiguracja OK: retries = 5, log_level = WARNING broken_text: to nie jest poprawny JSON: Expecting ',' delimiter
Podpowiedzi
Modyfikowanie słowników
# Modyfikowanie słowników
planet = {"name": "Mars", "moons": 2}
# Dodawanie nowego klucza
planet["diameter"] = 6779
print("Po dodaniu:", planet)
# Zmiana wartości
planet["moons"] = 3 # Pomyłka - poprawmy
planet["moons"] = 2
print("Po zmianie:", planet)
# Usuwanie elementu
del planet["diameter"]
print("Po del:", planet)
# pop() - usuwa i zwraca wartość
moons = planet.pop("moons")
print("Usunięte księżyce:", moons)
print("Pozostało:", planet)
# update() - dodaje wiele elementów
planet.update({"type": "skalista", "rings": False})
print("Po update:", planet)
Oddziel argumenty przecinkami. Każde uruchomienie przekazuje je jako sys.argv[1:].