perché - (3 trattini / trattino) nel file yaml?


116

Quindi ho appena iniziato a utilizzare YAMLfile invece di application.propertiesperché è più leggibile. Vedo nei YAMLfile con cui iniziano ---. Ho cercato su Google e ho trovato la spiegazione di seguito.

YAML utilizza tre trattini ("---") per separare le direttive dal contenuto del documento. Questo serve anche a segnalare l'inizio di un documento se non sono presenti direttive.

Inoltre, ho provato un campione senza ---e ho capito che non è obbligatorio averli.

Penso di non avere una chiara comprensione di directivee document. Qualcuno può spiegare con un semplice esempio?


3
Hai controllato le specifiche YAML? Descrive praticamente cos'è una direttiva o un documento . Spiacenti, questo si qualifica per idownvotedbecau.se/noresearch nel mio libro.
lexicore

19
@lexicore Ho controllato i documenti prima di provare un esempio. Ma non ho avuto una chiara comprensione e ho pensato che avrei capito meglio se qualcuno avesse spiegato. Mi dispiace se è apparso molto semplice, per tua informazione sono solo un principiante.
Andy,

Risposte:


66

Come hai già scoperto, i tre trattini ---vengono utilizzati per segnalare l'inizio di un documento , ovvero:

  1. Per segnalare l'inizio del documento dopo le direttive , cioè %YAMLo le %TAGrighe secondo la specifica corrente. Per esempio:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Per segnalare l'inizio del documento quando hai più documenti yaml nello stesso flusso , ad esempio un file yaml:

    doc 1
    ---
    doc 2
    

    Se doc 2 ha alcune direttive precedenti, allora dobbiamo usare tre punti ...per indicare la fine di doc 1 (e l'inizio di potenziali direttive precedenti doc 2) al parser. Per esempio:

    doc 1
    ...
    %TAG !bar! !bar-types/
    ---
    doc 2
    

La specifica è buona per gli implementatori del parser yaml. Tuttavia, trovo questo articolo più facile da leggere dal punto di vista dell'utente.


Ho letto la regola di produzione 211 nella specifica YAML 1.2 in modo tale che non hai bisogno di un indicatore di fine documento anche se hai direttive nel seguente documento, l'unica cosa richiesta in quel caso è che tu abbia una fine- indicatore delle direttive (all'inizio del l-explicit-document).
Anthon

La mia comprensione sull'uso tre punti si basa su questa frase di spec : "Se un documento non viene terminato da una linea marcatore di fine documento, quindi il seguente documento deve iniziare con una linea di marcatore direttive fine". La richiesta di un documento per cominciare il marcatore di fine direttive ---significherebbe che non sono consentite direttive per quel documento. Quindi se doc 2 ha direttive, doc 1 deve essere terminato con l'indicatore di fine documento ....
Yi Ou

In effetti, la definizione di documento-esplicito vieta le direttive: "Un documento esplicito inizia con una linea di marcatura finale delle direttive esplicite ma nessuna direttiva".
Yi Ou

La regola 211 ha esplicitamente le direttive al di fuori del documento-esplicito, e non sono sicuro che la tua citazione del testo lo contraddica. In ogni caso, i parser Python YAML lo implementano in questo modo (cioè non è necessario un indicatore di fine documento esplicito prima delle successive direttive sui documenti).
Anthon

Non vedo la regola 211 che consente le direttive precedenti l-explicit-document. L'espressione l-document-prefix*non contiene direttive. Non ho familiarità con il parser Python Yaml, ma una domanda interessante sarebbe se salta silenziosamente le direttive, se non sono precedute dai punti.
Yi Ou

55

Non è obbligatorio averli se non si inizia YAMLcon una direttiva. Se è il caso, dovresti usarli.

Diamo un'occhiata alla documentazione

3.2.3.4. direttive

Ogni documento può essere associato a una serie di direttive. Una direttiva ha un nome e una sequenza di parametri opzionale. Le direttive sono istruzioni per il processore YAML e, come tutti gli altri dettagli di presentazione, non si riflettono nell'albero di serializzazione YAML o nel grafico di rappresentazione . Questa versione di YAML definisce due direttive, "YAML" e "TAG". Tutte le altre direttive sono riservate per le future versioni di YAML.

Un esempio di questo può essere trovato anche nella documentazione per la direttivaYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.