tại sao - (3 dấu gạch ngang / gạch nối) trong tệp yaml?


116

Vì vậy, tôi chỉ bắt đầu sử dụng YAMLtệp thay vì application.propertiesnó dễ đọc hơn. Tôi thấy trong YAMLcác tệp bắt đầu bằng ---. Tôi đã truy cập và tìm thấy lời giải thích bên dưới.

YAML sử dụng ba dấu gạch ngang (“---”) để tách các lệnh khỏi nội dung tài liệu. Điều này cũng dùng để báo hiệu sự bắt đầu của một tài liệu nếu không có chỉ thị nào.

Ngoài ra, tôi đã thử một mẫu mà không có ---và hiểu rằng không bắt buộc phải có chúng.

Tôi nghĩ rằng tôi không hiểu rõ về directivedocument. Bất cứ ai có thể vui lòng giải thích với một ví dụ đơn giản?


3
Bạn đã kiểm tra thông số kỹ thuật YAML chưa? Nó mô tả khá nhiều chỉ thị hoặc tài liệu là gì. Xin lỗi, điều này đủ điều kiện cho idownvotedbecau.se/noresearch trên sách của tôi.
lexicore

19
@lexicore Tôi đã kiểm tra tài liệu trước khi thử một ví dụ. Nhưng tôi đã không hiểu rõ ràng và tôi nghĩ rằng tôi sẽ hiểu rõ hơn nếu ai đó giải thích. Tôi xin lỗi nếu nó có vẻ rất cơ bản, FYI Tôi chỉ là người mới bắt đầu.
Andy

Câu trả lời:


66

Như bạn đã tìm hiểu, ba dấu gạch ngang ---được sử dụng để báo hiệu sự bắt đầu của một tài liệu , tức là:

  1. Để báo hiệu tài liệu bắt đầu sau các lệnh , tức là %YAMLhoặc %TAGcác dòng theo thông số hiện tại. Ví dụ:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Để báo hiệu tài liệu bắt đầu khi bạn có nhiều tài liệu yaml trong cùng một luồng , ví dụ: một tệp yaml:

    doc 1
    ---
    doc 2
    

    Nếu tài liệu 2 có một số chỉ thị đứng trước, thì chúng ta phải sử dụng ba dấu chấm ...để biểu thị phần cuối của tài liệu 1 (và phần bắt đầu của các chỉ thị tiềm năng trước tài liệu 2) cho trình phân tích cú pháp. Ví dụ:

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

Thông số kỹ thuật tốt cho những người triển khai trình phân tích cú pháp yaml. Tuy nhiên, tôi thấy bài viết này dễ đọc hơn từ góc độ người dùng.


Tôi đọc quy tắc sản xuất 211 trong thông số kỹ thuật YAML 1.2 theo cách mà bạn không cần chỉ báo kết thúc tài liệu ngay cả khi bạn có chỉ thị trong tài liệu sau, điều duy nhất cần thiết trong trường hợp đó là bạn có một kết thúc- chỉ báo of-chỉ thị (ở đầu l-explicit-document).
Anthon

Sự hiểu biết của tôi về cách sử dụng ba dấu chấm dựa trên câu này của thông số kỹ thuật : "Nếu tài liệu không được kết thúc bằng dòng đánh dấu cuối tài liệu, thì tài liệu sau phải bắt đầu bằng dòng đánh dấu cuối chỉ thị." Yêu cầu tài liệu bắt đầu bằng điểm đánh dấu kết thúc chỉ thị ---sẽ có nghĩa là không có chỉ thị nào được phép cho tài liệu đó. Vì vậy, nếu tài liệu 2 có chỉ thị, tài liệu 1 phải được kết thúc bằng dấu kết thúc tài liệu ....
Yi Ou

Trên thực tế, định nghĩa của l-explicit-document cấm chỉ thị cho nó: "Một tài liệu rõ ràng bắt đầu bằng một dòng đánh dấu kết thúc chỉ thị rõ ràng nhưng không có chỉ thị nào."
Yi Ou

Quy tắc 211 rõ ràng có các chỉ thị bên ngoài tài liệu l-explicit-và tôi không chắc liệu trích dẫn của bạn về văn bản có mâu thuẫn với điều đó hay không. Trong mọi trường hợp, trình phân tích cú pháp Python YAML thực hiện theo cách đó (tức là bạn không cần chỉ báo kết thúc tài liệu rõ ràng trước các chỉ thị tài liệu tiếp theo).
Anthon

Tôi không thấy Quy tắc 211 cho phép các chỉ thị trước đó l-explicit-document. Biểu thức l-document-prefix*không chứa chỉ thị. Tôi không quen thuộc với trình phân tích cú pháp Python Yaml, nhưng một câu hỏi thú vị sẽ là liệu nó có bỏ qua các chỉ thị một cách âm thầm hay không, nếu chúng không được đặt trước bởi các dấu chấm.
Yi Ou

55

Không bắt buộc phải có chúng nếu bạn không bắt đầu YAMLbằng chỉ thị. Nếu đúng như vậy, bạn nên sử dụng chúng.

Chúng ta hãy xem tài liệu

3.2.3.4. Chỉ thị

Mỗi tài liệu có thể được liên kết với một tập hợp các chỉ thị. Một chỉ thị có tên và một chuỗi tham số tùy chọn. Các chỉ thị là các hướng dẫn tới bộ xử lý YAML và giống như tất cả các chi tiết trình bày khác không được phản ánh trong cây tuần tự hóa YAML hoặc đồ thị biểu diễn . Phiên bản này của YAML xác định hai chỉ thị, “YAML” và “TAG”. Tất cả các chỉ thị khác được dành riêng cho các phiên bản sau của YAML.

Một ví dụ về điều này cũng có thể được tìm thấy trong tài liệu hướng dẫnYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.