Niezwykle wygodne są dla mnie pliki w tym formacie. Generalnie większość rzeczy da się w nich spokojnie opisać. Praktycznie wszędzie istnieją narzędzia do łatwego odczytywania plików w tym formacie. Python nie jest odstępstwem od tej reguły i dostarcza moduł do pracy z plikami INI.
Wspomniany moduł to configparser (w 3.4, a wcześniej znany jako ConfigParser). Dostarcza on klasę ConfigParser, której użycie jest banalnie proste.
Załadowanie pliku INI to parę linii:
from configparser import ConfigParser config = ConfigParser() config.read('config.ini')
Dane z tak załadowanej konfiguracji można odczytać jak ze zwykłego słownika:
config['path']znacznie przyjemniejsze jest jednak użycie metody, która pozwala na pozyskanie wartości domyślnej, jeśli konfiguracja nie zawiera poszukiwanego ustawienia (tzw. fallback value):
config.get('path', '.')Konfiguracja może, a w zasadzie powinna składać się z sekcji. Najważniejsza z nich to DEFAULT. Ta sekcja powinna zawierać wszystkie ustawienia jakie mogą pojawić się w sekcjach i ich wartości domyślne. Jeśli w innej sekcji nie uda się odnaleźć wartości dla poszukiwanego ustawienia, sprawdzana jest właśnie sekcja DEFAULT. Co ważne, ma ona wyższy priorytet niż fallback value.
Przykładowo plik ini:
[DEFAULT] domain = alamakota.pl pass = "" [production] pass = s3cr3tKod python:
from configparser import ConfigParser config = ConfigParser() config.read('config.ini') config.get('production', 'domain')
zwróci:
"alamakota.pl"
Czyli wartość odczytaną nie z production, a z DEFAULT. Jak już wspominałem możliwe jest skorzystanie z ConfigParser jak ze słownika. Warto jednak pamiętać, że jeśli korzystamy z sekcji w pliku ini, to słownik będzie miał 2 poziomy, a nie jeden. Aby więc dostać się do jakiegoś ustawienia, musimy najpierw odwołać się do środowiska, a później do samego ustawienia po nazwie. Zaprezentowany wcześniej przykład możemy zapisać jako:
config['production']['domain']
Tak samo jak wcześniej uzyskamy wartość zapisaną w sekcji DEFAULT. Trzeba jednak pamiętać, że w tym przypadku jesteśmy skazani na przechwytywanie wyjątków. Jeśli spróbujemy odwołać się do sekcji, która nie istnieje, lub do nie istniejącego ustawienia rzucony zostanie wyjątek KeyError. Użycie w tym przypadku funkcji get generuje znacznie mniej utrudnień. Wyjątek rzucony zostanie przez nią zawsze jeśli odwołamy się do nieistniejącej sekcji, ale odwołanie do nie istniejącego ustawienia generuje wyjątek tylko, jeśli nie dostarczymy fallback value.
Brak komentarzy:
Prześlij komentarz