YAML + Python

YAML + Python

Poziom trudności
2/5

YAML, yamnik, jamniczek … w połączeniu z Pythonem, może tworzyć zgrany duet. YAML jako plik konfiguracyjny dowolnego kodu, testów itp. YAML zwany również jamnikiem jest uniwersalnym językiem przeznaczony do reprezentowania różnych danych w ustrukturalizowany sposób. Zdobywa fanów dzięki swojej czytelności. Tym bardziej wśród Python’owców ze względu na oddzielanie danych enterami i wcięciami.

Kropla historii - czyli czyim synem jest YAML

YAML został zaproponowany przez Clarka Evansa w 2001 roku, a stworzony wspólnie z Ingy döt Net’em i Oren Ben-Kiki. Kiedyś YAML był skrótem od Yet Another Markup Language, odwołując się do jego celu jako kolejny języka znaczników. Jako znaczniki uznajemy tekst znajdujący się na przykład w nawiasach ostrych „<>”. Używa się ich w języku HTML czy też XML.  Z czasem, gdy język YAML ewoluował, zmieniono rozwinięcie skrótu na YAML Ain’t Markup Language, aby rozróżnić jego cel, jako zorientowany na dane, a nie na znaczniki.

Charakterystyka Yamnika

YAML charakteryzuje się brakiem jakiegokolwiek skomplikowania. Dzięki swojej intuicyjnej strukturze nawet osoby kompletnie niezwiązane z programowaniem, otwierając go, będą w stanie swobodnie go odczytać. Zapis YAML’a składa się z kluczy i argumentów, które są oddzielone dwukropkiem, natomiast kolejne dane (jak już wcześniej wspominałem) oddzielone są znakami końca linii dla zwiększenia czytelności. Poziom zagnieżdżenia kolejnych struktur wyznaczają wcięcia. W YAMLU nie można używać tablulacji do wcięć! Dopuszczalne są tylko i wyłącznie spacje. Przyjęło się, że wcięcie składa się z dwóch spacji, ale biblioteka PyYAML obsługuje dowolną liczbę spacji na wcięcie, tylko musi być zawsze taka sama w danym pliku.

# Test YAML file
---
name: 'Config'
info:
test_name: 'yaml_test'
description: 'text'
timeout: 100
...

YAML’e zapisywane są z rozszerzeniem .yaml lub .yml. Możemy je rozpocząć znacznikiem trzech myślników   a zakończyć trzema kropkami  (jak możemy zauważyć powyżej). Znaczniki te są opcjonalne. Ważną informacją jest też, że wielkość liter zapisana w nim ma znaczenie (linuksiarze i pythonowcy powinni być przyzwyczajeni ;). YAML posiada też możliwość komentowania tekstu. Jedną z metod jest użycie znacznika # (hash).

Jamnik trawiony przez pytona

Najpopularniejszą biblioteką obsługującą YAML’a jest PyYAML. Aby ją zainstalować, najprościej użyć aplikacji pip:

pip install pyyaml

Do zaczytania biblioteki w Python’ie wystarczy import yaml. Zaczytajmy więc pokazany wyżej przykład reprezentujący plik YAML za pomocą metody load do Python’a:

  1. import yaml
  2. yaml_file = """
  3. # Test YAML file
  4. ---
  5. name: 'Config'
  6. info:
  7. test_name: 'yaml_test'
  8. description: 'text'
  9. timeout: 100
  10. ...
  11. """
  12. x = yaml.load(yaml_file)
  13. print(x)
  14. print(type(x))

Zanim jednak zajmiemy się wynikiem metod print, przyjrzyjmy się wywołanej metodzie load. Użyliśmy w niej argumentu string reprezentującego zawartość pliku yaml. Po zaczytaniu takiego string’a otrzymamy słownik odpowiednio zawierający wszystkie dane (oprócz komentarza) z powyższego pliku:

{'name': 'Config', 'info': {'test_name': 'yaml_test', 'description': 'text', 'timeout': 100}}
<class 'dict'>

W powyższym przykładzie widzimy jak uzyskać jako argumenty string’i, liczby i słowniki. Każda kolejna wartość listy w YAML’u rozpoczyna się myślnikiem, a kończy znakiem końca linii lub zapisać w nawiasach kwadratowych w jednej linii, ale jest to oczywiście mniej czytelne. Do poprzedniego przykładu dodałem klucz list_example z listą zawierającą dwie wartości string one i two

  1. import yaml
  2. yaml_file = """
  3. # Test YAML file
  4. ---
  5. name: 'Config'
  6. info:
  7. test_name: 'yaml_test'
  8. description: 'text'
  9. timeout: 100
  10. list_example:
  11. - 'one'
  12. - 'two'
  13. ...
  14. """
  15. x = yaml.load(yaml_file)
  16. print(x)
{'name': 'Config', 'info': {'test_name': 'yaml_test', 'description': 'text', 'timeout': 100, 'list_example': ['one', 'two']}}

Zapis do formatu YAML odbywa się za pomocą metody dump. Odwróćmy więc sytuację i użyjmy wyniku z poprzedniego przykładu, aby wygenerować strukturę YAML’a:

  1. import yaml
  2. dict_sample = {'info': {'description': 'text', 'list_example': ['one', 'two'], 'test_name': 'yaml_test', 'timeout': 100}, 'name': 'Config'}
  3. x = yaml.dump(dict_sample)
  4. print(x)

Do metody dump wystarczy wstawić słownik, aby w prosty sposób przekonwertować do postaci YAML’a:

info:
description: text
list_example:
- one
- two
test_name: yaml_test
timeout: 100
name: Config

Możemy zauważyć drobne różnice względem przytoczonego wcześniej przykładu. String nie zawiera trzech myślników na początku i trzech kropek na końcu. Są one opcjonalne w przypadku gdy plik zawiera czystą strukturę YAML’a i jest odczytywany przez PyYAML’a jednak należy pamiętać, że jeżeli nasz YAML jest używany w różnych miejscach, to jednak warto ich używać. Kolejną różnicą jest brak cudzysłowów (lub apostrofów) w przypadku stringów. To także jest opcjonalny znacznik. Uważam jednak, że dla samej czytelności kodu powinno się ich używać – ale jest o to w tym wypadku kwestia gustu 😉 .

Jak widać, YAML jest bardzo przyjazną formą przedstawiania danych i mam nadzieję, że przyjazny yamnik zagości również w waszym repozytorium jako, na przykład, plik konfiguracyjny.

YAML + Python image

Dodaj komentarz