Python:
Lavorare con YAML

Come fare:

Leggere e scrivere YAML in Python in genere comporta l’utilizzo di una libreria di terze parti, con PyYAML che è la più popolare. Per iniziare, dovrai installare PyYAML eseguendo pip install PyYAML.

Esempio: Scrivere su un File YAML

import yaml

data = {'una lista': [1, 42, 3.141, 1337, 'aiuto', u'€'],
        'una stringa': 'boo!',
        'un altro dizionario': {'foo': 'bar', 'chiave': 'valore', 'la risposta': 42}}

with open('esempio.yaml', 'w') as f:
    yaml.dump(data, f, default_flow_style=False)

# Questo crea `esempio.yaml` con i dati strutturati in formato YAML.

Esempio: Leggere da un File YAML

import yaml

with open('esempio.yaml', 'r') as f:
    dati_caricati = yaml.safe_load(f)

print(dati_caricati)

# Output: 
# {'una lista': [1, 42, 3.141, 1337, 'aiuto', '€'],
#  'una stringa': 'boo!',
#  'un altro dizionario': {'foo': 'bar', 'chiave': 'valore', 'la risposta': 42}}

Uso di YAML per la Configurazione

Molti programmatori usano YAML per gestire le configurazioni delle applicazioni. Ecco un esempio di come si potrebbe strutturare un file di configurazione e leggerlo:

config.yaml:

database:
  host: localhost
  port: 5432
  username: admin
  password: segreto

Lettura del file di configurazione in Python:

import yaml

with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

print(config['database']['host'])  # Output: localhost

Gestione di Strutture Complesse

Per strutture complesse, PyYAML consente di definire oggetti Python personalizzati. Tuttavia, assicurati di praticare l’uso sicuro utilizzando safe_load per evitare l’esecuzione di funzioni o oggetti arbitrari.

import yaml

# Definire un oggetto Python
class Esempio:
    def __init__(self, valore):
        self.valore = valore

# Costruttore personalizzato
def costruttore_esempio(loader, node):
    valore = loader.construct_scalar(node)
    return Esempio(valore)

# Aggiungere costruttore per il tag "!example"
yaml.add_constructor('!example', costruttore_esempio)

yaml_str = "!example 'dati'"
caricato = yaml.load(yaml_str, Loader=yaml.FullLoader)

print(caricato.valore)  # Output: dati

In questo frammento, !example è un tag personalizzato usato per istanziare un oggetto Esempio con il valore ‘dati’ da una stringa YAML. Loader personalizzati come questo ampliano la flessibilità di PyYAML, consentendo l’elaborazione di strutture e tipi di dati più complessi.