YAML Ain’t Markup Language ( YAML ) là một ngôn ngữ tuần tự hóa dữ liệu luôn được liệt kê là một trong những ngôn ngữ lập trình phổ biến nhất. Nó thường được sử dụng làm định dạng cho các tệp cấu hình, nhưng khả năng tuần tự hóa đối tượng của nó khiến nó trở thành sự thay thế khả thi cho các ngôn ngữ như JSON. Hướng dẫn YAML này sẽ trình bày cú pháp ngôn ngữ với hướng dẫn và một số ví dụ mã hóa đơn giản trong Python . YAML có hỗ trợ ngôn ngữ rộng và dễ dàng ánh xạ vào các cấu trúc dữ liệu gốc. Con người cũng dễ đọc, đó là lý do tại sao nó là một lựa chọn tốt cho cấu hình. Từ viết tắt YAML là viết tắt của Yet Another Markup Language. Nhưng những người bảo trì đã đổi tên nó thành YAML Ain’t Markup Language để nhấn mạnh hơn vào các tính năng hướng dữ liệu của nó.
Hướng dẫn YAML Bắt đầu nhanh: Một tệp đơn giản
Chúng ta hãy xem xét tệp YAML để có cái nhìn tổng quan ngắn gọn.
---
doe: "a deer, a female deer"
ray: "a drop of golden sun"
pi: 3.14159
xmas: true
french-hens: 3
calling-birds:
- huey
- dewey
- louie
- fred
xmas-fifth-day:
calling-birds: four
french-hens: 3
golden-rings: 5
partridges:
count: 1
location: "a pear tree"
turtle-doves: two
Tệp bắt đầu bằng ba dấu gạch ngang. Những dấu gạch ngang này biểu thị phần đầu của một tài liệu YAML mới. YAML hỗ trợ nhiều tài liệu và trình phân tích cú pháp tuân thủ sẽ nhận dạng mỗi bộ dấu gạch ngang là phần đầu của một tài liệu mới. Tiếp theo, chúng ta thấy cấu trúc tạo nên phần lớn tài liệu YAML thông thường: cặp khóa-giá trị. “Doe” là khóa trỏ đến giá trị chuỗi: “a deer, a female deer”. YAML hỗ trợ nhiều hơn là chỉ các giá trị chuỗi. Tệp bắt đầu bằng sáu cặp khóa-giá trị. Chúng có bốn kiểu dữ liệu khác nhau. “doe” và “ray” là chuỗi. “pi” là số dấu phẩy động. “xmas” là boolean. “french-hens” là số nguyên. Bạn có thể đặt chuỗi trong dấu ngoặc đơn(‘) hoặc dấu ngoặc kép(“) hoặc không có dấu ngoặc kép nào cả. YAML nhận dạng các số không được trích dẫn là số nguyên hoặc dấu phẩy động. Mục thứ bảy là một mảng. “calling-birds” có bốn phần tử, mỗi phần tử được biểu thị bằng dấu gạch ngang mở. Tôi đã thụt lề các phần tử trong “calling-birds” bằng hai khoảng trắng. Thụt lề là cách YAML biểu thị sự lồng nhau. Số lượng khoảng trắng có thể thay đổi tùy theo từng tệp, nhưng không được phép sử dụng tab. Chúng ta sẽ xem cách thụt lề hoạt động bên dưới. Cuối cùng, chúng ta thấy “xmas-fifth-day”, có thêm năm phần tử bên trong, mỗi phần tử đều được thụt lề. Chúng ta có thể xem “xmas-fifth-day” như một từ điển chứa hai chuỗi, hai số nguyên và một từ điển khác. YAML hỗ trợ lồng nhau của khóa-giá trị và trộn các loại. Trước khi đi sâu hơn, hãy xem tài liệu này trông như thế nào trong JSON. Tôi sẽ đưa nó vào trình chuyển đổi JSON sang YAML tiện dụng này .
{
"doe": "a deer, a female deer",
"ray": "a drop of golden sun",
"pi": 3.14159,
"xmas": true,
"french-hens": 3,
"calling-birds": [
"huey",
"dewey",
"louie",
"fred"
],
"xmas-fifth-day": {
"calling-birds": "four",
"french-hens": 3,
"golden-rings": 5,
"partridges": {
"count": 1,
"location": "a pear tree"
},
"turtle-doves": "two"
}
}
JSON và YAML có khả năng tương tự nhau và bạn có thể chuyển đổi hầu hết các tài liệu giữa các định dạng này.
Phác thảo thụt lề và khoảng trắng
Khoảng trắng là một phần trong định dạng của YAML. Trừ khi có chỉ định khác, dòng mới sẽ chỉ ra phần cuối của một trường. Bạn cấu trúc một tài liệu YAML bằng cách thụt lề. Mức thụt lề có thể là một hoặc nhiều khoảng trắng. Đặc tả này cấm các tab vì các công cụ xử lý chúng theo cách khác. Hãy xem xét tài liệu này. Các mục bên trong được thụt lề bằng hai khoảng trắng.
foo: bar
pleh: help
stuff:
foo: bar
bar: foo
Hãy cùng xem một tập lệnh python đơn giản xem tài liệu này như thế nào. Chúng ta sẽ lưu nó dưới dạng tệp có tên là foo.yaml . Gói PyYAML sẽ ánh xạ luồng tệp YAML vào một từ điển. Chúng ta sẽ lặp qua tập hợp khóa và giá trị ngoài cùng và in khóa và biểu diễn chuỗi của mỗi giá trị. Bạn có thể tìm bộ xử lý cho nền tảng yêu thích của mình tại đây.
Import yaml
from yaml import load
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader
if __name__ == '__main__':
stream = open("foo.yaml", 'r')
dictionary = yaml.load(stream)
for key, value in dictionary.items():
print (key + " : " + str(value))
Output:
foo : bar
pleh : help
stuff : {'foo': 'bar', 'bar': 'foo'}
Khi chúng ta yêu cầu python in một từ điển dưới dạng chuỗi, nó sử dụng cú pháp nội tuyến mà chúng ta sẽ thấy bên dưới. Chúng ta có thể thấy từ đầu ra rằng tài liệu của chúng ta là một từ điển python với hai chuỗi và một từ điển khác được lồng bên trong nó. Việc lồng nhau đơn giản của YAML cung cấp cho chúng ta sức mạnh để xây dựng các đối tượng phức tạp. Nhưng đó chỉ là khởi đầu.
Bình luận bắt đầu bằng dấu thăng. Chúng có thể xuất hiện sau giá trị tài liệu hoặc chiếm toàn bộ một dòng.
___
# This is a full line comment
foo: bar # this is a comment, too
Bình luận dành cho con người. Bộ xử lý YAML sẽ loại bỏ chúng.
Kiểu dữ liệu YAML
Các giá trị trong cặp khóa-giá trị của YAML là vô hướng. Chúng hoạt động giống như các kiểu vô hướng trong các ngôn ngữ như Perl, Javascript và Python. Thường thì chỉ cần đặt chuỗi trong dấu ngoặc kép, để số không có dấu ngoặc kép và để trình phân tích cú pháp tìm ra là đủ. Nhưng đó chỉ là phần nổi của tảng băng chìm. YAML có khả năng làm được nhiều hơn thế nữa.
Cặp khóa-giá trị và từ điển
Key-value là khối xây dựng cơ bản của YAML. Mỗi mục trong tài liệu YAML là thành viên của ít nhất một từ điển. Khóa luôn là một chuỗi. Giá trị là một số vô hướng nên có thể là bất kỳ kiểu dữ liệu nào. Vì vậy, như chúng ta đã thấy, giá trị có thể là một chuỗi, một số hoặc một từ điển khác.
Các loại số
YAML nhận dạng các kiểu số. Chúng ta đã thấy số dấu phẩy động và số nguyên ở trên. YAML hỗ trợ một số kiểu số khác. Một số nguyên có thể là số thập phân, thập lục phân hoặc bát phân.
---
foo: 12345
bar: 0x12d4
plop: 023332
Hãy chạy tập lệnh python trên tài liệu này.
foo : 12345
bar : 4820
plop : 9946
Như bạn mong đợi, Ox biểu thị giá trị là hex và số 0 đứng đầu biểu thị giá trị bát phân. YAML hỗ trợ cả số dấu phẩy động cố định và số mũ.
---
foo: 1230.15
bar: 12.3015e+05
Khi chúng tôi đánh giá các mục này, chúng tôi thấy:
foo : 1230.15
bar : 1230150.0
Cuối cùng, chúng ta có thể biểu diễn không phải số (NAN) hoặc vô cực.
---
foo: .inf
bar: -.Inf
plop: .NAN
Giá trị của foo là vô cực. Bar là âm vô cực và plop là NAN.
Chuỗi
Chuỗi YAML là Unicode. Trong hầu hết các trường hợp, bạn không cần phải chỉ định chúng trong dấu ngoặc kép.
---
foo: this is a normal string
Chương trình thử nghiệm của chúng tôi xử lý điều này như sau:
foo: this is a normal string
Nhưng nếu chúng ta muốn xử lý chuỗi thoát, chúng ta cần sử dụng dấu ngoặc kép.
---
foo: "this is not a normal string\n"
bar: this is not a normal string\n
YAML xử lý giá trị đầu tiên như kết thúc bằng một ký tự xuống dòng và xuống dòng. Vì giá trị thứ hai không được trích dẫn, YAML xử lý \n như hai ký tự.
foo: this is not a normal string
bar: this is not a normal string\n
YAML sẽ không thoát chuỗi bằng dấu ngoặc đơn, nhưng dấu ngoặc đơn tránh việc nội dung chuỗi được diễn giải là định dạng tài liệu. Giá trị chuỗi có thể kéo dài hơn một dòng. Với ký tự fold (lớn hơn), bạn có thể chỉ định một chuỗi trong một khối.
bar: >
this is not a normal string it
spans more than
one line
see?
Nhưng nó được diễn giải mà không cần xuống dòng.
bar : this is not a normal string it spans more than one line see?
Ký tự khối (ống) có chức năng tương tự, nhưng YAML diễn giải trường chính xác như hiện trạng.
bar: |
this is not a normal string it
spans more than
one line
see?
Vì vậy, chúng ta thấy các dòng mới ở vị trí nào trong tài liệu.
bar : this is not a normal string it
spans more than
one line
see?
Nulls
Bạn nhập giá trị null bằng dấu ngã (~) hoặc chuỗi ký tự null không có dấu ngoặc kép.
---
foo: ~
bar: null
Chương trình của chúng tôi in:
foo : None
bar : None
Biểu diễn null của Python là None.
Boolean
YAML chỉ ra các giá trị boolean với các từ khóa True, On và Yes cho giá trị true. False được chỉ ra bằng False, Off hoặc No.
---
foo: True
bar: False
light: On
TV: Off
Mảng
Bạn có thể chỉ định mảng hoặc danh sách trên một dòng.
---
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]
Hoặc bạn có thể đặt chúng trên nhiều dòng.
---
items:
- 1
- 2
- 3
- 4
- 5
names:
- "one"
- "two"
- "three"
- "four"
Định dạng nhiều dòng hữu ích cho các danh sách chứa các đối tượng phức tạp thay vì các số vô hướng.
___
items:
- things:
thing1: huey
things2: dewey
thing3: louie
- other things:
key: value
Một mảng có thể chứa bất kỳ giá trị YAML hợp lệ nào. Các giá trị trong danh sách không nhất thiết phải cùng loại.
Từ điển
Chúng tôi đã đề cập đến từ điển ở trên, nhưng chúng còn nhiều hơn thế nữa. Giống như mảng, bạn có thể đặt từ điển trực tuyến. Chúng tôi đã thấy định dạng này ở trên. Đó là cách python in từ điển.
---
foo: { thing1: huey, thing2: louie, thing3: dewey }
Chúng ta đã từng thấy họ xếp hàng trước đây.
---
foo: bar
bar: foo
Và tất nhiên, chúng có thể lồng nhau và giữ bất kỳ giá trị nào.
---
foo:
bar:
- bar
- rab
- plop
Tùy chọn nâng cao
Bộ điều chỉnh Chomp
Giá trị nhiều dòng có thể kết thúc bằng khoảng trắng và tùy thuộc vào cách bạn muốn xử lý tài liệu, bạn có thể không muốn giữ nguyên nó. YAML có các toán tử strip chomp và preserve chomp. Để lưu ký tự cuối cùng, hãy thêm dấu cộng vào toán tử fold hoặc block.
bar: >+
this is not a normal string it
spans more than
one line
see?
Vì vậy, nếu giá trị kết thúc bằng khoảng trắng, như ký tự xuống dòng, YAML sẽ giữ nguyên giá trị đó. Để xóa ký tự, hãy sử dụng toán tử xóa.
bar: |-
this is not a normal string it
spans more than
one line
see?
Nhiều tài liệu
Một tài liệu bắt đầu bằng ba dấu gạch ngang và kết thúc bằng ba dấu chấm. Một số bộ xử lý YAML yêu cầu toán tử bắt đầu tài liệu. Toán tử kết thúc thường là tùy chọn. Ví dụ, Jackson của Java sẽ không xử lý tài liệu YAML mà không có phần bắt đầu, nhưng PyYAML của Python sẽ xử lý. Bạn thường sẽ sử dụng toán tử kết thúc tài liệu khi một tệp chứa nhiều tài liệu. Hãy cùng sửa đổi mã python của chúng ta.
import yaml
from yaml import load
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader
if __name__ == '__main__':
stream = open("foo.yaml", 'r')
dictionary = yaml.load_all(stream, Loader)
for doc in dictionary:
print("New document:")
for key, value in doc.items():
print(key + " : " + str(value))
if type(value) is list:
print(str(len(value)))
Load_all của PyYAML sẽ xử lý tất cả các tài liệu trong một luồng. Bây giờ, hãy xử lý một tài liệu hợp nhất bằng nó.
---
bar: foo
foo: bar
...
---
one: two
three: four
Tập lệnh tìm thấy hai tài liệu YAML.
New document:
bar : foo
foo : bar
New document:
one : two
three : four
Phần kết luận
YAML là một ngôn ngữ mạnh mẽ có thể được sử dụng cho các tệp cấu hình, tin nhắn giữa các ứng dụng và lưu trạng thái ứng dụng. Chúng tôi đã đề cập đến các tính năng được sử dụng phổ biến nhất của nó, bao gồm cách sử dụng các kiểu dữ liệu tích hợp và cấu trúc các tài liệu phức tạp. Một số nền tảng hỗ trợ các tính năng nâng cao của YAML, bao gồm các kiểu dữ liệu tùy chỉnh.