dlaczego - (3 myślniki / łącznik) w pliku yaml?


116

Więc po prostu zacząłem używać YAMLpliku zamiast, application.propertiesponieważ jest bardziej czytelny. Widzę w YAMLplikach, od których zaczynają ---. Poszukałem w Google i znalazłem poniższe wyjaśnienie.

YAML używa trzech myślników („---”) do oddzielenia dyrektyw od zawartości dokumentu. Służy to również do zasygnalizowania początku dokumentu, jeśli nie ma żadnych dyrektyw.

Wypróbowałem również próbkę bez ---i zrozumiałem, że ich posiadanie nie jest obowiązkowe.

Myślę, że nie rozumiem dokładnie directivei document. Czy ktoś może wyjaśnić na prostym przykładzie?


3
Czy sprawdziłeś specyfikację YAML? W zasadzie opisuje, czym jest dyrektywa lub dokument . Przepraszamy, to kwalifikuje się do idownvotedbecau.se/noresearch w mojej książce.
leksykor

19
@lexicore Sprawdziłem dokumenty, zanim spróbowałem przykładu. Ale nie uzyskałem jasnego zrozumienia i pomyślałem, że lepiej zrozumiem, jeśli ktoś wyjaśni. Przepraszam, jeśli wydawało się to bardzo podstawowe, FYI, jestem tylko początkującym.
Andy

Odpowiedzi:


66

Jak już się dowiedziałeś, trzy myślniki ---służą do zasygnalizowania początku dokumentu , tj .:

  1. Aby zasygnalizować rozpoczęcie dokumentu po dyrektywach , tj. %YAMLLub %TAGwierszach zgodnie z bieżącą specyfikacją. Na przykład:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Aby zasygnalizować rozpoczęcie dokumentu, gdy masz wiele dokumentów yaml w tym samym strumieniu , np. Plik yaml:

    doc 1
    ---
    doc 2
    

    Jeśli dokument 2 ma jakieś poprzednie dyrektywy, to musimy użyć trzech kropek, ...aby wskazać parserowi koniec dokumentu 1 (i początek potencjalnych dyrektyw poprzedzających dokument 2). Na przykład:

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

Specyfikacja jest dobra dla implementatorów parsera yaml. Jednak uważam, że ten artykuł jest łatwiejszy do odczytania z perspektywy użytkownika.


Przeczytałem regułę produkcji 211 w specyfikacji YAML 1.2 w taki sposób, że nie potrzebujesz wskaźnika końca dokumentu, nawet jeśli masz dyrektywy w poniższym dokumencie, jedyną wymaganą rzeczą w tym przypadku jest to, że masz koniec- Wskaźnik dyrektyw (na początku r l-explicit-document.).
Anthon,

Moje rozumienie użycia trzech kropek opiera się na tym zdaniu specyfikacji : „Jeśli dokument nie jest zakończony linią znacznika końca dokumentu, wówczas następujący dokument musi zaczynać się od dyrektywy kończącej linię znacznika.” Wymaganie dokumentu na początku znacznik końca dyrektyw ---oznaczałby, że żadne dyrektywy nie są dozwolone dla tego dokumentu. Więc jeśli dokument 2 ma dyrektywy, dokument 1 musi być zakończony znacznikiem końca dokumentu ....
Yi Ou

W rzeczywistości definicja l-jawnego-dokumentu zabrania stosowania dyrektyw: „Dokument jawny zaczyna się od wyraźnej dyrektywy kończy linię znacznika, ale nie ma dyrektyw”.
Yi Ou

Reguła 211 wyraźnie zawiera dyrektywy poza l-wyraźnym dokumentem i nie jestem pewien, czy twoje cytowanie tekstu w ogóle temu zaprzecza. W każdym razie parsery YAML Pythona implementują to w ten sposób (tj. Nie potrzebujesz jawnego wskaźnika końca dokumentu przed następnymi dyrektywami dokumentów).
Anthon,

Nie widzę reguły 211 zezwalającej na dyrektywy l-explicit-document. Wyrażenie l-document-prefix*nie zawiera dyrektyw. Nie znam parsera Python Yaml, ale interesującym pytaniem byłoby, czy po prostu po cichu pomija dyrektywy, jeśli nie są poprzedzone kropkami.
Yi Ou,

55

Posiadanie ich nie jest obowiązkowe, jeśli nie zaczynasz YAMLod dyrektywy. W takim przypadku powinieneś ich użyć.

Rzućmy okiem na dokumentację

3.2.3.4. Dyrektywy

Każdy dokument może być powiązany z zestawem dyrektyw. Dyrektywa ma nazwę i opcjonalną sekwencję parametrów. Dyrektywy są instrukcjami dla procesora YAML i podobnie jak wszystkie inne szczegóły prezentacji nie są odzwierciedlane w drzewie serializacji YAML ani na wykresie reprezentacji . Ta wersja YAML definiuje dwie dyrektywy: „YAML” i „TAG”. Wszystkie inne dyrektywy są zastrzeżone dla przyszłych wersji YAML.

Jeden z przykładów można znaleźć w dokumentacji dyrektywyYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.