pourquoi - (3 tirets / trait d'union) dans le fichier yaml?


116

J'ai donc juste commencé à utiliser un YAMLfichier au lieu de application.propertiescar il est plus lisible. Je vois dans les YAMLfichiers avec lesquels ils commencent ---. J'ai cherché sur Google et trouvé l'explication ci-dessous.

YAML utilise trois tirets («---») pour séparer les directives du contenu du document. Cela sert également à signaler le début d'un document si aucune directive n'est présente.

Aussi, j'ai essayé un échantillon sans ---et compris qu'il n'est pas obligatoire de les avoir.

Je pense que je ne comprends pas clairement directiveet document. Quelqu'un peut-il expliquer avec un exemple simple?


3
Avez-vous vérifié la spécification YAML? Il décrit assez bien ce qu'est une directive ou un document . Désolé, cela se qualifie pour idownvotedbecau.se/noresearch sur mon livre.
lexicore

19
@lexicore J'ai vérifié la documentation avant d'essayer un exemple. Mais je n'ai pas obtenu une compréhension claire et j'ai pensé que je comprendrais mieux si quelqu'un m'expliquait. Je suis désolé si cela semblait très basique, pour info je ne suis qu'un débutant.
Andy

Réponses:


66

Comme vous l'avez déjà découvert, les trois tirets ---sont utilisés pour signaler le début d'un document , à savoir:

  1. Pour signaler le début du document après des directives , c'est-à-dire, %YAMLou des %TAGlignes selon la spécification actuelle. Par exemple:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Pour signaler le début du document lorsque vous avez plusieurs documents yaml dans le même flux , par exemple un fichier yaml:

    doc 1
    ---
    doc 2
    

    Si doc 2 a des directives précédentes, alors nous devons utiliser trois points ...pour indiquer la fin de doc 1 (et le début des directives potentielles précédant doc 2) à l'analyseur. Par exemple:

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

La spécification est bonne pour les implémenteurs d'analyseurs yaml. Cependant, je trouve cet article plus facile à lire du point de vue de l'utilisateur.


J'ai lu la règle de production 211 dans la spécification YAML 1.2 de telle manière que vous n'avez pas besoin d'un indicateur de fin de document même si vous avez des directives dans le document suivant, la seule chose requise dans ce cas est que vous ayez une fin- indicateur des directives (au début de la l-explicit-document).
Anthon

Ma compréhension de l'utilisation des trois points est basée sur cette phrase de la spécification : "Si un document n'est pas terminé par une ligne de marqueur de fin de document, le document suivant doit commencer par une ligne de marqueur de fin de directives." Exiger un document pour commencer par le marqueur de fin de directives ---signifierait qu'aucune directive n'est autorisée pour ce document. Donc, si le doc 2 a des directives, le doc 1 doit se terminer par le marqueur de fin de document ....
Yi Ou

En fait, la définition de l-explicit-document interdit les directives pour celui-ci: "Un document explicite commence par une ligne de marqueur de fin de directives explicites mais pas de directives."
Yi Ou

La règle 211 contient explicitement les directives en dehors du document l-explicite, et je ne sais pas si votre citation du texte contredit même cela. Dans tous les cas, les analyseurs Python YAML l'implémentent de cette façon (c'est-à-dire que vous n'avez pas besoin d'un indicateur de fin de document explicite avant les prochaines directives de documents).
Anthon

Je ne vois pas l'article 211 autorisant les directives précédentes l-explicit-document. L'expression l-document-prefix*ne contient pas de directives. Je ne suis pas familier avec l'analyseur Python Yaml, mais une question intéressante serait de savoir s'il saute silencieusement les directives, si elles ne sont pas précédées par les points.
Yi Ou

55

Il n'est pas obligatoire de les avoir si vous ne commencez pas votre YAML par une directive. Si c'est le cas, vous devriez les utiliser.

Jetons un œil à la documentation

3.2.3.4. Directives

Chaque document peut être associé à un ensemble de directives. Une directive a un nom et une séquence facultative de paramètres. Les directives sont des instructions destinées au processeur YAML et, comme tous les autres détails de présentation, ne sont pas reflétés dans l'arborescence de sérialisation ou le graphique de représentation YAML . Cette version de YAML définit deux directives, «YAML» et «TAG». Toutes les autres directives sont réservées aux futures versions de YAML.

Un exemple de ceci peut également être trouvé dans la documentation de la directiveYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.