por qué - (3 guiones / guión) en el archivo yaml?

116

Así que comencé a usar el YAMLarchivo en lugar de application.propertiesya que es más legible. Veo en YAMLarchivos con los que comienzan ---. Busqué en Google y encontré la siguiente explicación.

YAML usa tres guiones (“---”) para separar las directivas del contenido del documento. Esto también sirve para señalar el inicio de un documento si no hay directivas presentes.

Además, probé una muestra sin ---y entendí que no es obligatorio tenerlos.

Creo que no tengo una comprensión clara de directivey document. ¿Alguien puede explicarlo con un ejemplo simple?

Andy
fuente
3
¿Ha comprobado la especificación YAML? Básicamente describe lo que es una directiva o un documento . Lo siento, esto califica para idownvotedbecau.se/noresearch en mi libro.
lexicore
19
@lexicore Revisé los documentos antes de probar un ejemplo. Pero no lo entendí claramente y pensé que lo entendería mejor si alguien me explicaba. Lo siento si parecía muy básico, para su información, solo soy un principiante.
Andy

Respuestas:

66

Como ya descubrió, los tres guiones ---se utilizan para señalar el inicio de un documento , es decir:

  1. Para señalar el inicio del documento después de las directivas , es decir, %YAMLo %TAGlíneas de acuerdo con la especificación actual. Por ejemplo:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Para señalar el inicio del documento cuando tiene varios documentos yaml en la misma secuencia , por ejemplo, un archivo yaml:

    doc 1
    ---
    doc 2
    

    Si doc 2 tiene algunas directivas anteriores, entonces tenemos que usar tres puntos ...para indicar el final de doc 1 (y el comienzo de las directivas potenciales que preceden al doc 2) al analizador. Por ejemplo:

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

La especificación es buena para los implementadores del analizador yaml. Sin embargo, encuentro este artículo más fácil de leer desde la perspectiva del usuario.

Yi Ou
fuente
Leí la regla de producción 211 en la especificación YAML 1.2 de tal manera que no necesita un indicador de fin de documento incluso si tiene directivas en el siguiente documento, lo único que se requiere en ese caso es que tenga un final indicador de directivas (al principio del l-explicit-document).
Anthon
Mi opinión sobre el uso de tres puntos se basa en esta frase de la especificación : "Si un documento no está terminada por una línea de marcador documento fin, a continuación, el siguiente documento debe comenzar con una línea de marcador directivas final." La exigencia de un documento, para empezar el marcador final de directivas ---significaría que no se permiten directivas para ese documento. Entonces, si doc 2 tiene directivas, doc 1 debe terminar con el marcador de fin de documento ....
Yi Ou
De hecho, la definición de l-explicit-document prohíbe las directivas: "Un documento explícito comienza con una línea de marcador de final de directivas explícitas pero sin directivas".
Yi Ou
La regla 211 tiene explícitamente las directivas fuera de l-explicit-document, y no estoy seguro de si su cita del texto incluso contradice eso. En cualquier caso, los analizadores de Python YAML lo implementan de esa manera (es decir, no necesita un indicador explícito de fin de documento antes de las siguientes directivas de documentos).
Anthon
No veo que la Regla 211 permita directivas anteriores l-explicit-document. La expresión l-document-prefix*no contiene directivas. No estoy familiarizado con el analizador de Python Yaml, pero una pregunta interesante sería si simplemente omite silenciosamente las directivas, si no están precedidas por puntos.
Yi Ou
55

No es obligatorio tenerlos si no comienza YAMLcon una directiva. Si es el caso, debes usarlos.

Echemos un vistazo a la documentación.

3.2.3.4. Directivas

Cada documento puede estar asociado con un conjunto de directivas. Una directiva tiene un nombre y una secuencia opcional de parámetros. Las directivas son instrucciones para el procesador YAML y, como todos los demás detalles de presentación, no se reflejan en el árbol de serialización de YAML ni en el gráfico de representación . Esta versión de YAML define dos directivas, "YAML" y "TAG". Todas las demás directivas están reservadas para futuras versiones de YAML.

También se puede encontrar un ejemplo de esto en la documentación de la directivaYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
Yassin Hajaj
fuente