Space Python Ładowanie Pythona…

Wczytywanie konfiguracji

Napisz kodTrudny 3 etapy

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.

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.

Połączona konfiguracja

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)).

Cztery problemy

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
Trzy pliki
load_config() dla dowolnego tekstu
Nie jesteś zalogowany, więc postęp zostaje tylko w tej przeglądarce. Zaloguj się, aby go zapisać i korzystać z podpowiedzi oraz rozwiązań.

Podpowiedzi

Modyfikowanie słowników

Dodawanie przez przypisanie nowego klucza. del usuwa element. pop() usuwa i zwraca wartość. update() dodaje wiele par naraz.
modyfikowanie-slownikow.py
# 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)
Otwórz cały przykład
script.py
PythonWiersz 1, kol. 1Spacje: 4
Ładowanie środowiska Pythona…

Oddziel argumenty przecinkami. Każde uruchomienie przekazuje je jako sys.argv[1:].