porque - (3 traços / hífen) no arquivo yaml?

116

Então, comecei a usar o YAMLarquivo em vez de application.propertiesporque é mais legível. Eu vejo nos YAMLarquivos com os quais eles começam ---. Eu pesquisei e encontrei a explicação abaixo.

YAML usa três travessões (“---”) para separar as diretivas do conteúdo do documento. Isso também serve para sinalizar o início de um documento se nenhuma diretiva estiver presente.

Além disso, experimentei uma amostra sem ---e entendi que não é obrigatório tê-los.

Acho que não tenho uma compreensão clara de directivee document. Alguém pode explicar com um exemplo simples?

Andy
fonte
3
Você verificou a especificação YAML? Quase descreve o que é uma diretiva ou um documento . Desculpe, isso se qualifica para idownvotedbecau.se/noresearch em meu livro.
Lexicore
19
@lexicore Eu verifiquei os documentos antes de tentar um exemplo. Mas não tive um entendimento claro e achei que entenderia melhor se alguém explicasse. Lamento se pareceu muito básico, para sua informação, sou apenas um iniciante.
Andy

Respostas:

66

Como você já descobriu, os três travessões ---são usados ​​para sinalizar o início de um documento , ou seja:

  1. Para sinalizar o início do documento após as diretivas , ou seja, %YAMLou %TAGlinhas de acordo com a especificação atual. Por exemplo:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Para sinalizar o início do documento quando você tiver vários documentos yaml no mesmo fluxo , por exemplo, um arquivo yaml:

    doc 1
    ---
    doc 2
    

    Se o doc 2 tiver algumas diretivas anteriores, então temos que usar três pontos ...para indicar o final do doc 1 (e o início das diretivas potenciais anteriores ao doc 2) para o analisador. Por exemplo:

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

A especificação é boa para implementadores de analisador yaml. No entanto, acho este artigo mais fácil de ler da perspectiva do usuário.

Yi Ou
fonte
Eu li a regra de produção 211 na especificação YAML 1.2 de tal forma que você não precisa de um indicador de fim de documento, mesmo que tenha diretivas no documento a seguir, a única coisa necessária nesse caso é que você tenha um indicador de fim indicador de diretivas (no início do l-explicit-document).
Anthon
O meu entendimento sobre o uso três pontos baseia-se esta frase de especificação : "Se um documento não for denunciado por uma linha marcador documento fim, então o seguinte documento deve começar com uma linha de marcação directivas fim." A exigência de um documento para começar o marcador de fim das diretivas ---significaria que não são permitidas diretivas para esse documento. Portanto, se o documento 2 tiver diretivas, o documento 1 deve ser encerrado com o marcador de fim do documento ....
Yi Ou
Na verdade, a definição de l-explicit-document proíbe diretivas para ele: "Um documento explícito começa com uma linha de marcador final de diretivas explícitas, mas sem diretivas."
Yi Ou
A regra 211 explicitamente tem as diretrizes fora do l-explicit-document, e eu não tenho certeza se sua citação do texto contradiz isso. Em qualquer caso, os analisadores Python YAML o implementam dessa maneira (ou seja, você não precisa de um indicador de fim de documento explícito antes das próximas diretivas de documentos).
Anthon
Não vejo a regra 211 permitindo as diretivas anteriores l-explicit-document. A expressão l-document-prefix*não contém diretivas. Não estou familiarizado com o analisador Python Yaml, mas uma questão interessante seria se ele simplesmente ignora silenciosamente as diretivas, se elas não forem precedidas pelos pontos.
Yi Ou
55

Não é obrigatório tê-los se você não começar YAMLcom uma diretiva. Se for o caso, você deve usá-los.

Vamos dar uma olhada na documentação

3.2.3.4. Diretivas

Cada documento pode ser associado a um conjunto de diretivas. Uma diretiva tem um nome e uma sequência opcional de parâmetros. As diretivas são instruções para o processador YAML e, como todos os outros detalhes da apresentação, não são refletidas na árvore de serialização YAML ou no gráfico de representação . Esta versão de YAML define duas diretivas, “YAML” e “TAG”. Todas as outras diretivas são reservadas para versões futuras do YAML.

Um exemplo disso também pode ser encontrado na documentação da diretivaYAML

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