Python:
Praca z YAML
Jak to zrobić:
Odczyt i zapis w YAML w Pythonie zazwyczaj wymaga użycia zewnętrznej biblioteki, przy czym PyYAML
jest najbardziej popularny. Aby rozpocząć, musisz zainstalować PyYAML, wykonując pip install PyYAML
.
Przykład: Zapis do pliku YAML
import yaml
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
'a string': 'boo!',
'another dict': {'foo': 'bar', 'key': 'value', 'the answer': 42}}
with open('example.yaml', 'w') as f:
yaml.dump(data, f, default_flow_style=False)
# To tworzy `example.yaml` z danymi zorganizowanymi w formacie YAML.
Przykład: Odczyt z pliku YAML
import yaml
with open('example.yaml', 'r') as f:
data_loaded = yaml.safe_load(f)
print(data_loaded)
# Wynik:
# {'a list': [1, 42, 3.141, 1337, 'help', '€'],
# 'a string': 'boo!',
# 'another dict': {'foo': 'bar', 'key': 'value', 'the answer': 42}}
Używanie YAML do konfiguracji
Wielu programistów używa YAML do zarządzania konfiguracjami aplikacji. Oto przykład, jak można zorganizować plik konfiguracyjny i odczytać go:
config.yaml:
database:
host: localhost
port: 5432
username: admin
password: secret
Odczytywanie pliku konfiguracyjnego w Pythonie:
import yaml
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f)
print(config['database']['host']) # Wynik: localhost
Obsługa złożonych struktur
Dla złożonych struktur, PyYAML pozwala definiować niestandardowe obiekty Pythona. Jednak, dla bezpieczeństwa, należy używać safe_load
, aby unikać wykonywania arbitralnych funkcji lub obiektów.
import yaml
# Definiowanie obiektu Pythona
class Example:
def __init__(self, value):
self.value = value
# Niestandardowy konstruktor
def constructor_example(loader, node):
value = loader.construct_scalar(node)
return Example(value)
# Dodawanie konstruktora dla tagu "!example"
yaml.add_constructor('!example', constructor_example)
yaml_str = "!example 'data'"
loaded = yaml.load(yaml_str, Loader=yaml.FullLoader)
print(loaded.value) # Wynik: data
W tym fragmencie, !example
to niestandardowy tag używany do instancji obiektu Example
z wartością ‘data’ z ciągu YAML. Niestandardowe ładowarki takie jak ta zwiększają elastyczność PyYAML, umożliwiając przetwarzanie bardziej złożonych struktur danych i typów.