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.