Trong phần này, chúng tôi sẽ viết YAML thích hợp. Ánh xạ YAML còn được gọi là mảng kết hợp, bảng băm, khóa. cặp giá trị hoặc bộ sưu tập. Trong ánh xạ, tên của hai khóa không được giống nhau. Có bốn loại ánh xạ
- ánh xạ đơn giản
- ánh xạ trình tự
- ánh xạ lồng nhau
- ánh xạ hỗn hợp
Ánh xạ đơn giản
Trong ánh xạ đơn giản, chúng tôi sẽ cung cấp một khóa trong phần đầu tiên, sau đó phân tách bằng dấu hai chấm và dấu cách. Nó là cần thiết để sử dụng một không gian. Chúng tôi sẽ đặt từng thành viên của danh sách trên một dòng mới nếu chúng tôi muốn thêm một danh sách có khóa [từ điển] vào tài liệu của mình, trong ví dụ này, chúng tôi có một khóa máy chủ và giá trị của máy chủ là phl-42. Chúng tôi cũng có một học sinh chủ chốt, và tên học sinh đó là harry
Thí dụ
Trong một phím duy nhất. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi sẽ sử dụng dấu ngoặc kép để hiển thị giá trị của khóa. Khi chúng tôi đánh giá ví dụ YAML ở trên trong python, chúng tôi sẽ nhận được như sau
Trình tự trong ánh xạ
Chúng ta có thể ánh xạ giá trị của khóa theo trình tự. Trong ví dụ sau, chúng tôi có một sở thích chính và một danh sách theo sở thích. Nó chứa các dấu gạch ngang để cho biết rằng đó là một danh sách, không chỉ là một khóa-giá trị
Thí dụ
Trong khóa thứ tự. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi phải sử dụng dấu ngoặc vuông để hiển thị danh sách sở thích và chúng tôi cũng phải sử dụng dấu phẩy giữa tất cả các sở thích. Chúng tôi sẽ thêm tất cả những thứ này trong một dòng. Khi chúng tôi đánh giá ví dụ trên, chúng tôi sẽ nhận được như sau
Ánh xạ lồng nhau
Chúng ta có thể lồng ánh xạ vào nhau. Trong ví dụ sau, chúng tôi có một trung tâm dữ liệu chính và bên dưới trung tâm dữ liệu, chúng tôi có ba khóa. cặp giá trị. Cái đầu tiên là vị trí cho giá trị canada. Cái thứ hai là cab cho giá trị 13. Cái thứ ba là cab_unit cho giá trị 3
Thí dụ
Trong khóa lồng nhau. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi phải sử dụng dấu ngoặc nhọn và chúng tôi cũng phải sử dụng dấu phẩy giữa các giá trị bổ sung của mình. Chúng tôi sẽ thêm tất cả những thứ này trong một dòng như sau
network: version: 2 renderer: networkd ethernets: ens3: dhcp4: no addresses: [155.128.134.198/23,'2002:18f0:b009:f84:5200:03ff:fdf7:d0c2/64'] gateway4: 155.128.134.198 nameservers: addresses: [108.61.10.10]____1
$ python3 addy.py {'network': {'ethernets': {'addresses': ['155.128.134.198/23', '2002:18f0:b009:f84:5200:03ff:fdf7:d0c2/64', 'abc'], 'dhcp4': False, 'ens3': None, 'gateway4': '155.128.134.198', 'nameservers': {'addresses': ['108.61.10.10']}}, 'renderer': 'networkd', 'version': 2}} $
Thêm ví dụ mã Python
Ví dụ phổ biến
YAML Ain't Markup Language [YAML] là ngôn ngữ tuần tự hóa đã tăng dần mức độ phổ biến trong vài năm qua. 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ó làm cho nó trở thành một 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ữ bằng hướng dẫn và một số ví dụ viết mã đơn giản trong Python. YAML có hỗ trợ ngôn ngữ rộng rãi và ánh xạ dễ dàng 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 tin đơn giản
Chúng ta hãy xem một tệp YAML để biết 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. Các dấu gạch ngang này cho biết phần đầu của một tài liệu YAML mới. YAML hỗ trợ nhiều tài liệu và các trình phân tích cú pháp tuân thủ sẽ nhận ra mỗi tập hợp 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 hầu hết tài liệu YAML điển hình. một cặp khóa-giá trị. Doe là một khóa trỏ đến một giá trị chuỗi. một con nai, một con nai cái. YAML không chỉ hỗ trợ các giá trị chuỗi. Tệp bắt đầu với sáu cặp khóa-giá trị. Họ có bốn loại dữ liệu khác nhau. Doe và ray là dây. Pi là một số dấu chấm động. Giáng sinh là một boolean. gà mái Pháp là một số nguyên. Bạn có thể đặt các 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 chữ số không được trích dẫn dưới dạng số nguyên hoặc dấu phẩy động. Mục thứ bảy là một mảng. Gọi chim có bốn yếu tố, mỗi yếu tố được biểu thị bằng một dấu gạch ngang mở đầu. Tôi thụt vào các phần tử trong tiếng gọi chim có hai dấu cách. Thụt đầu dòng là cách YAML biểu thị lồng nhau. Số lượng khoảng trắng có thể thay đổi từ tệp này sang tệp khác, nhưng các tab không được phép. Chúng ta sẽ xem xét cách hoạt động của thụt đầu dò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ử được thụt vào. 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 các khóa-giá trị và trộn các loại. Trước khi tìm hiểu sâu hơn, hãy xem tài liệu này trông như thế nào trong JSON. Tôi sẽ ném 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
Phác thảo thụt đầu dòng và khoảng trắng
Khoảng trắng là một phần của định dạng YAML. Trừ khi có chỉ định khác, các dòng mới cho biết phần cuối của một trường. Bạn cấu trúc một tài liệu YAML với thụt đầu dòng. Mức thụt đầu dòng có thể là một hoặc nhiều khoảng trắng. Thông số kỹ thuật cấm các tab vì các công cụ đối xử với chúng khác nhau. Xem xét tài liệu này. Các mục bên trong công cụ được thụt vào với hai dấu cách
foo: bar pleh: help stuff: foo: bar bar: foo
Chúng ta hãy xem cách một tập lệnh python đơn giản xem tài liệu này. Chúng tôi sẽ lưu nó dưới dạng tệp có tên foo. khoai mỡ. Gói PyYAML sẽ ánh xạ luồng tệp YAML vào từ điển. Chúng tôi sẽ lặp qua tập hợp khóa và giá trị ngoài cùng, đồng thời in khóa và biểu diễn chuỗi của từng giá trị. Bạn có thể tìm thấy bộ xử lý cho nền tảng yêu thích của mình tại đây
import yaml if __name__ == '__main__': stream = open["foo.yaml", 'r'] dictionary = yaml.load[stream] for key, value in dictionary.items[]: print [key + " : " + str[value]]
đầu ra là
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 một chuỗi, nó sẽ 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 có hai chuỗi và một từ điển khác được lồng bên trong nó. Việc lồng ghép đơn giản của YAML cho chúng ta sức mạnh để xây dựng các đối tượng phức tạp. Nhưng đó mới chỉ là khởi đầu
Bình luận
Nhận xét bắt đầu bằng dấu thăng. Chúng có thể xuất hiện sau một giá trị tài liệu hoặc chiếm toàn bộ một dòng
________số 8Nhận xét là 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. Nó thường đủ tốt để đặt các chuỗi trong dấu ngoặc kép, để lại các số không được trích dẫn và để trình phân tích cú pháp tìm ra nó. 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ế
Cặp khóa-giá trị và từ điển
Khóa-giá trị 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. Chìa khóa luôn là một chuỗi. Giá trị là một đại lượng để 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 ra các loại số. Chúng tôi đã thấy dấu phẩy động và số nguyên ở trên. YAML hỗ trợ một số loại số khác. Một số nguyên có thể là 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 của chúng tôi trên tài liệu này
import yaml import pprint with open['old.yaml','r'] as in_yamlfile: cur_yaml = yaml.safe_load[in_yamlfile] cur_yaml['network']['ethernets']['addresses'].append['abc'] pprint.pprint[cur_yaml] with open['new.yaml','w'] as out_yamlfile: yaml.safe_dump[cur_yaml, out_yamlfile] with open['new.yaml','r'] as inn_yamlfile: new_yaml = yaml.safe_load[inn_yamlfile] assert[cur_yaml == new_yaml]0
Như bạn mong đợi, Ox cho biết giá trị là hệ thập lục phân và số 0 ở đầ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ũ
import yaml import pprint with open['old.yaml','r'] as in_yamlfile: cur_yaml = yaml.safe_load[in_yamlfile] cur_yaml['network']['ethernets']['addresses'].append['abc'] pprint.pprint[cur_yaml] with open['new.yaml','w'] as out_yamlfile: yaml.safe_dump[cur_yaml, out_yamlfile] with open['new.yaml','r'] as inn_yamlfile: new_yaml = yaml.safe_load[inn_yamlfile] assert[cur_yaml == new_yaml]1
Khi chúng tôi đánh giá các mục này, chúng tôi thấy
import yaml import pprint with open['old.yaml','r'] as in_yamlfile: cur_yaml = yaml.safe_load[in_yamlfile] cur_yaml['network']['ethernets']['addresses'].append['abc'] pprint.pprint[cur_yaml] with open['new.yaml','w'] as out_yamlfile: yaml.safe_dump[cur_yaml, out_yamlfile] with open['new.yaml','r'] as inn_yamlfile: new_yaml = yaml.safe_load[inn_yamlfile] assert[cur_yaml == new_yaml]2
Cuối cùng, chúng ta có thể đại diện cho số không [NAN] hoặc vô cực
{ "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" } }0
foo là vô cùng. Thanh là vô cực âm và plop là NAN
Dây
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
{ "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" } }1
Chương trình thử nghiệm của chúng tôi xử lý điều này như
{ "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" } }2
Nhưng nếu chúng ta muốn xử lý các chuỗi thoát, chúng ta cần sử dụng dấu ngoặc kép
{ "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" } }3
YAML xử lý giá trị đầu tiên khi kết thúc bằng dấu xuống dòng và nguồn cấp dữ liệu. Vì giá trị thứ hai không được trích dẫn, YAML coi \n là hai ký tự
{ "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" } }4
YAML sẽ không thoát khỏi các chuỗi có dấu nháy đơn, nhưng các dấu nháy đơn tránh nội dung chuỗi được hiểu là định dạng tài liệu. Giá trị chuỗi có thể kéo dài nhiều hơn một dòng. Với ký tự gấp [lớn hơn], bạn có thể chỉ định một chuỗi trong một khối
{ "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" } }5
Nhưng nó được giải thích mà không có dòng mới
{ "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" } }6
Ký tự khối [đường ống] có chức năng tương tự, nhưng YAML diễn giải trường chính xác như là
{ "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" } }7
Vì vậy, chúng ta thấy vị trí của các dòng mới trong tài liệu
{ "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" } }8
Null
Bạn nhập null với dấu ngã hoặc chuỗi ký tự null không được trích dẫ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" } }9
chương trình của chúng tôi in
foo: bar pleh: help stuff: foo: bar bar: foo0
Đại diện của Python cho null là Không có
Booleans
YAML cho biết các giá trị boolean với các từ khóa True, On và Yes cho true. Sai được biểu thị bằng Sai, Tắt hoặc Không
foo: bar pleh: help stuff: foo: bar bar: foo1
Mảng
Bạn có thể chỉ định mảng hoặc danh sách trên một dòng
foo: bar pleh: help stuff: foo: bar bar: foo2
Hoặc, bạn có thể đặt chúng trên nhiều dòng
foo: bar pleh: help stuff: foo: bar bar: foo3
Đị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ì vô hướng
foo: bar pleh: help stuff: foo: bar bar: foo4
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 các từ điển ở trên, nhưng còn nhiều từ điển khác nữa. Giống như mảng, bạn có thể đặt từ điển trong dòng. Chúng tôi đã thấy định dạng này ở trên. Đó là cách python in từ điển
foo: bar pleh: help stuff: foo: bar bar: foo5
Chúng tôi đã nhìn thấy chúng kéo dài các dòng trước đây
foo: bar pleh: help stuff: foo: bar bar: foo6
Và, tất nhiên, chúng có thể được lồng vào nhau và giữ bất kỳ giá trị nào
foo: bar pleh: help stuff: foo: bar bar: foo7
Tùy chọn nâng cao
công cụ sửa đổi chomp
Các 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 tài liệu được xử lý mà bạn có thể không muốn giữ lại tài liệu đó. YAML có các toán tử chomp và bảo toàn dải. Để lưu ký tự cuối cùng, hãy thêm dấu cộng vào các toán tử gấp hoặc khối
foo: bar pleh: help stuff: foo: bar bar: foo8
Vì vậy, nếu giá trị kết thúc bằng khoảng trắng, chẳng hạn như một dòng mới, YAML sẽ giữ nguyên giá trị đó. Để tách ký tự, sử dụng toán tử dải
foo: bar pleh: help stuff: foo: bar bar: foo9
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 bắt đầu, nhưng PyYAML của Python sẽ. Bạn sẽ thường 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 sửa đổi mã python của chúng tôi
import yaml if __name__ == '__main__': stream = open["foo.yaml", 'r'] dictionary = yaml.load[stream] for key, value in dictionary.items[]: print [key + " : " + str[value]]0
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 phức hợp với nó
import yaml if __name__ == '__main__': stream = open["foo.yaml", 'r'] dictionary = yaml.load[stream] for key, value in dictionary.items[]: print [key + " : " + str[value]]1
Tập lệnh tìm thấy hai tài liệu YAML
import yaml if __name__ == '__main__': stream = open["foo.yaml", 'r'] dictionary = yaml.load[stream] for key, value in dictionary.items[]: print [key + " : " + str[value]]2
Sự 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, thông báo 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 loại dữ liệu tùy chỉnh