YAML + Python

YAML, yamnik, jamniczek … w połączeniu z Pythonem, może tworzyć zgrany duet. YAML jako plik konfiguracyjny dowolnego kodu, testów itp.

Yaml i python

Yaml + python


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 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:

import yaml
 
yaml_file = """
# Test YAML file
---
name: 'Config'
info:
    test_name: 'yaml_test'
    description: 'text'
    timeout: 100
...
"""
 
x = yaml.load(yaml_file)
print(x)
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’iliczby 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

import yaml
 
yaml_file = """
# Test YAML file
---
name: 'Config'
info:
    test_name: 'yaml_test'
    description: 'text'
    timeout: 100
    list_example:
        - 'one'
        - 'two'
...
"""
 
x = yaml.load(yaml_file)
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:

import yaml
 
dict_sample = {'info': {'description': 'text', 'list_example': ['one', 'two'], 'test_name': 'yaml_test', 'timeout': 100}, 'name': 'Config'}
 
x = yaml.dump(dict_sample)
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.

close

Newsletter