Python thường được bán trên thị trường như một ngôn ngữ bao gồm pin bởi vì nó đi kèm với hầu hết mọi thứ mà bạn đã từng mong đợi từ một ngôn ngữ lập trình. Tuyên bố này chủ yếu là đúng, vì thư viện tiêu chuẩn và các mô -đun bên ngoài bao gồm một phổ rộng các nhu cầu lập trình. Tuy nhiên, Python thiếu hỗ trợ tích hợp cho định dạng dữ liệu YAML, thường được sử dụng để cấu hình và tuần tự hóa, mặc dù có điểm tương đồng rõ ràng giữa hai ngôn ngữ.YAML data format, commonly used for configuration and serialization, despite clear similarities between the two languages.
Trong hướng dẫn này, bạn sẽ học cách làm việc với YAML trong Python bằng các thư viện của bên thứ ba có sẵn, tập trung vào Pyyaml. Nếu bạn mới sử dụng YAML hoặc thiên đường đã sử dụng nó trong một thời gian, thì bạn sẽ có cơ hội tham gia một khóa học về sự cố nhanh chóng trước khi đi sâu hơn vào chủ đề này.PyYAML. If you’re new to YAML or haven’t used it in a while, then you’ll have a chance to take a quick crash course before diving deeper into the topic.
Trong hướng dẫn này, bạn sẽ học cách:
- Đọc và viết tài liệu YAML bằng Python and write YAML documents in Python
- Nối tiếp hóa các loại dữ liệu tùy chỉnh và tích hợp Python Python’s built-in and custom data types to YAML
- Đọc một cách an toàn các tài liệu YAML từ các nguồn không đáng tin cậy read YAML documents from untrusted sources
- Kiểm soát các tài liệu yaml phân tích cú pháp ở cấp độ thấp hơnparsing YAML documents at a lower level
Sau đó, bạn sẽ tìm hiểu về các tính năng nâng cao, có khả năng nguy hiểm của YAML và cách bảo vệ bản thân khỏi chúng. Để phân tích YAML ở mức thấp, bạn sẽ xây dựng một công cụ tổng hợp cú pháp và xem trước tương tác trong HTML. Cuối cùng, bạn sẽ tận dụng các thẻ YAML tùy chỉnh để mở rộng cú pháp định dạng dữ liệu.syntax highlighter tool and an interactive preview in HTML. Finally, you’ll take advantage of custom YAML tags to extend the data format’s syntax.
Để tận dụng tối đa hướng dẫn này, bạn nên làm quen với lập trình hướng đối tượng trong Python và biết cách tạo ra một lớp học. Nếu bạn đã sẵn sàng để nhảy vào, thì bạn có thể theo liên kết bên dưới để lấy mã nguồn cho các ví dụ mà bạn sẽ mã trong hướng dẫn này:
Tham gia một khóa học gặp sự cố ở YAML
Trong phần này, bạn sẽ tìm hiểu các sự kiện cơ bản về YAML, bao gồm sử dụng, cú pháp và một số tính năng độc đáo và mạnh mẽ của nó. Nếu bạn đã làm việc với YAML trước đây, thì bạn có thể bỏ qua trước và tiếp tục đọc từ phần tiếp theo, bao gồm sử dụng YAML trong Python.
Bối cảnh lịch sử
Yaml, có vần với Camel, là một từ viết tắt đệ quy là viết tắt của ngôn ngữ đánh dấu Yaml ain, vì nó không phải là ngôn ngữ đánh dấu! Điều thú vị là, bản nháp ban đầu cho đặc tả YAML đã định nghĩa ngôn ngữ này là một ngôn ngữ đánh dấu khác, nhưng sau đó, các backronym hiện tại đã được áp dụng để mô tả chính xác hơn mục đích của ngôn ngữ.YAML Ain’t Markup Language because it’s not a markup language! Interestingly enough, the original draft for the YAML specification defined the language as Yet Another Markup Language, but later the current backronym was adopted to more accurately describe the language’s purpose.
Một ngôn ngữ đánh dấu thực tế, chẳng hạn như Markdown hoặc HTML, cho phép bạn chú thích văn bản với các hướng dẫn định dạng hoặc xử lý được kết hợp với nội dung của bạn. Do đó, các ngôn ngữ đánh dấu chủ yếu liên quan đến các tài liệu văn bản, trong khi YAML là định dạng tuần tự hóa dữ liệu tích hợp tốt với các loại dữ liệu phổ biến có nguồn gốc từ nhiều ngôn ngữ lập trình. Không có văn bản cố hữu trong YAML, chỉ có dữ liệu để đại diện.data serialization format that integrates well with common data types native to many programming languages. There’s no inherent text in YAML, only data to represent.
YAML ban đầu có nghĩa là để đơn giản hóa ngôn ngữ đánh dấu mở rộng [XML], nhưng trong thực tế, nó có nhiều điểm chung hơn với ký hiệu đối tượng JavaScript [JSON]. Trên thực tế, nó là một siêu JSON.
Mặc dù XML ban đầu được thiết kế để trở thành một ngôn ngữ kim loại để tạo ra các ngôn ngữ đánh dấu cho các tài liệu, mọi người đã nhanh chóng áp dụng nó làm định dạng tuần tự hóa dữ liệu tiêu chuẩn. Cú pháp giống như HTML của giá đỡ góc làm cho XML trông quen thuộc. Đột nhiên, mọi người đều muốn sử dụng XML làm cấu hình, sự kiên trì hoặc định dạng nhắn tin của họ.
Là đứa trẻ đầu tiên trong khối, XML thống trị hiện trường trong nhiều năm. Nó trở thành một định dạng trao đổi dữ liệu trưởng thành và đáng tin cậy và giúp định hình các khái niệm mới như xây dựng các ứng dụng web tương tác. Rốt cuộc, chữ X trong AJAX, một kỹ thuật lấy dữ liệu từ máy chủ mà không tải lại trang, là viết tắt của không khác ngoài XML.data interchange format and helped shape new concepts like building interactive web applications. After all, the letter X in AJAX, a technique for getting data from the server without reloading the page, stands for none other than XML.
Trớ trêu thay, AJAX cuối cùng đã dẫn đến sự suy giảm phổ biến của XML. Cú pháp XML dài dòng, phức tạp và dự phòng đã lãng phí rất nhiều băng thông khi dữ liệu được gửi qua mạng. Phân tích các tài liệu XML trong JavaScript rất chậm và tẻ nhạt vì mô hình đối tượng tài liệu cố định của XML [DOM], sẽ phù hợp với mô hình dữ liệu của ứng dụng. Cộng đồng cuối cùng đã thừa nhận rằng họ đã sử dụng sai công cụ cho công việc.
Điều đó khi Json bước vào bức tranh. Nó được xây dựng từ đầu với việc tuần tự hóa dữ liệu trong tâm trí. Các trình duyệt web có thể phân tích nó một cách dễ dàng vì JSON là một tập hợp con của JavaScript, mà họ đã hỗ trợ. Không chỉ là cú pháp tối giản của JSON, đối với các nhà phát triển, mà còn giúp chuyển sang các nền tảng khác dễ dàng hơn XML. Cho đến ngày nay, JSON vẫn là định dạng trao đổi dữ liệu văn bản mỏng nhất, nhanh nhất và linh hoạt nhất trên Internet.
YAML ra đời cùng năm với JSON, và bởi sự trùng hợp thuần túy, nó gần như là một siêu hoàn toàn của JSON ở cấp độ cú pháp và ngữ nghĩa. Bắt đầu từ YAML 1.2, định dạng chính thức trở thành một superset nghiêm ngặt của JSON, có nghĩa là mọi tài liệu JSON hợp lệ cũng là một tài liệu YAML.superset of JSON, meaning that every valid JSON document also happens to be a YAML document.
Tuy nhiên, trong thực tế, hai định dạng trông khác nhau, vì đặc điểm kỹ thuật của YAML nhấn mạnh hơn vào khả năng đọc của con người bằng cách thêm nhiều đường cú pháp và các tính năng hơn trên JSON. Do đó, YAML có thể áp dụng nhiều hơn cho các tệp cấu hình được chỉnh sửa bằng tay chứ không phải là lớp vận chuyển.
So sánh với XML và JSON
Nếu bạn quen thuộc với XML hoặc JSON, thì bạn có thể tự hỏi YAML mang đến cái gì cho bàn. Cả ba đều là các định dạng trao đổi dữ liệu chính, chia sẻ một số tính năng chồng chéo. Ví dụ, họ là tất cả các văn bản dựa trên văn bản và ít nhiều có thể đọc được của con người. Đồng thời, chúng khác nhau về nhiều khía cạnh, mà bạn sẽ tìm ra tiếp theo.text based and more or less human readable. At the same time, they differ in many respects, which you’ll find out next.
Bây giờ hãy xem một tài liệu mẫu được thể hiện ở cả ba định dạng dữ liệu nhưng đại diện cho cùng một người. Bạn có thể nhấp để mở rộng các phần có thể thu gọn và tiết lộ dữ liệu được tuần tự hóa trong các định dạng đó:
1969-12-31
true
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
Thoạt nhìn, XML dường như có cú pháp đáng sợ nhất, làm tăng thêm rất nhiều tiếng ồn. JSON cải thiện đáng kể tình hình về mặt đơn giản, nhưng nó vẫn chôn vùi thông tin bên dưới những người phân định bắt buộc. Mặt khác, YAML sử dụng thụt khối kiểu Python để xác định cấu trúc, làm cho nó trông sạch sẽ và đơn giản. Nhược điểm là bạn có thể thu gọn khoảng trắng để giảm kích thước khi chuyển tin nhắn qua dây.block indentation to define the structure, making it look clean and straightforward. The downside is that you can’t collapse whitespace to reduce size when transferring messages over the wire.
Ở đây, một so sánh có phần chủ quan của XML, JSON và YAML để cung cấp cho bạn ý tưởng về cách họ xếp chồng lên nhau như các định dạng trao đổi dữ liệu ngày nay:
Nhận con nuôi và hỗ trợ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
Khả năng đọc | ⭐⭐ | Khả năng đọc | ⭐⭐⭐⭐ |
⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
Khả năng đọc | ⭐⭐ | Khả năng đọc | ⭐⭐ |
Khả năng đọc
⭐⭐⭐
Đọc và ghi tốc độ
⭐
Kích thước tập tin
Khi bạn nhìn vào các xu hướng của Google để theo dõi sự quan tâm trong ba cụm từ tìm kiếm, thì bạn sẽ kết luận rằng JSON là người chiến thắng hiện tại. Tuy nhiên, XML không phải là phía sau, với YAML thu hút ít sự quan tâm nhất. Ngoài ra, có vẻ như sự phổ biến của XML đã bị suy giảm ổn định kể từ khi Google bắt đầu thu thập dữ liệu.
Yaml được cho là dễ nhất trong mắt, vì khả năng đọc luôn là một trong những nguyên tắc cốt lõi của nó, nhưng JSON cũng không phải là người xấu. Một số thậm chí có thể thấy JSON ít lộn xộn và ồn ào do cú pháp tối giản và sự tương đồng với danh sách và từ điển Python. XML là dòng dài nhất, vì nó yêu cầu gói mọi thông tin trong một cặp thẻ mở và đóng.
Trong Python, hiệu suất khi làm việc với các định dạng dữ liệu này sẽ thay đổi và nó sẽ rất nhạy cảm với việc thực hiện bạn chọn. Một triển khai Python thuần túy sẽ luôn thua một thư viện C được biên dịch. Ngoài ra, sử dụng các mô hình xử lý XML khác nhau khác nhau [DOM, SAX hoặc STAX] cũng sẽ ảnh hưởng đến hiệu suất.
- Việc triển khai sang một bên, cú pháp đa năng, tự do và phức tạp của YAML, cho đến nay là chậm nhất để phân tích và tuần tự hóa. Ở phía bên kia của quang phổ, bạn sẽ tìm thấy JSON, có ngữ pháp có thể phù hợp với danh thiếp. Ngược lại, tài liệu ngữ pháp của riêng YAML, tuyên bố rằng việc tạo ra một trình phân tích cú pháp tuân thủ đầy đủ đã được chứng minh gần như không thể. Uses YAML to describe the desired state of the remote infrastructure, manage the configuration, and orchestrate IT processes
- Khi nói đến kích thước tài liệu, JSON là người chiến thắng rõ ràng một lần nữa. Trong khi các dấu ngoặc kép, dấu phẩy và dấu ngoặc xoăn chiếm không gian có giá trị, bạn có thể loại bỏ tất cả khoảng trắng giữa các yếu tố riêng lẻ. Bạn có thể làm tương tự với các tài liệu XML, nhưng nó đã giành chiến thắng vượt qua chi phí của các thẻ mở và đóng. Yaml ngồi ở đâu đó ở giữa bằng cách có kích thước tương đối trung bình. Uses YAML to describe the microservices comprising your Dockerized application
- Trong lịch sử, XML đã có sự hỗ trợ tốt nhất trên một loạt các công nghệ. JSON là một định dạng trao đổi toàn diện không thể đánh bại để chuyển dữ liệu trên internet. Vì vậy, ai sử dụng yaml và tại sao? Uses YAML to define various objects in a computer cluster to orchestrate and manage
Sử dụng thực tế của yaml
Có lẽ bạn sẽ quyết định áp dụng YAML trong dự án tương lai của mình sau khi hoàn thành hướng dẫn này!
Cú pháp YAML
YAML lấy cảm hứng nặng nề từ các định dạng và ngôn ngữ dữ liệu khác mà bạn có thể đã nghe trước đây. Có lẽ yếu tố nổi bật và quen thuộc nhất của cú pháp YAML, là thụt khối khối của nó, giống như mã Python. Khoảng trắng hàng đầu trên mỗi dòng xác định phạm vi của một khối, loại bỏ sự cần thiết cho bất kỳ ký tự hoặc thẻ đặc biệt nào để biểu thị nơi nó bắt đầu hoặc kết thúc:block indentation, which resembles Python code. The leading whitespace on each line defines the scope of a block, eliminating the need for any special characters or tags to denote where it begins or ends:
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
Tài liệu mẫu này xác định một cây gia đình với
{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
7 là phần tử gốc, có con ngay lập tức là phần tử {
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
8, có hai con với thuộc tính {
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
9 ở mức thấp nhất trong cây. Bạn có thể nghĩ về từng yếu tố như một tuyên bố mở đầu theo sau là một đại tràng [recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
0] trong Python.Đồng thời, YAML cho phép bạn tận dụng một cú pháp chặn nội tuyến thay thế được mượn từ JSON. Bạn có thể viết lại cùng một tài liệu theo cách sau:inline-block syntax borrowed from JSON. You can rewrite the same document in the following way:
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
Lưu ý cách bạn có thể trộn các khối thụt lề và nội tuyến trong một tài liệu. Ngoài ra, bạn có thể tự do gửi cả các thuộc tính và giá trị của chúng trong các trích dẫn đơn [
recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
1] hoặc trích dẫn kép [recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
2] nếu bạn muốn. Làm như vậy cho phép một trong hai phương pháp nội suy của các chuỗi ký tự đặc biệt, nếu không được thoát khỏi một dấu gạch chéo ngược khác [recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
3] cho bạn. Dưới đây, bạn sẽ tìm thấy các tương đương Python cùng với YAML:
4 | 5 | Các chuỗi chưa được trích dẫn được phân tích cú pháp theo nghĩa đen để các chuỗi thoát như 6 trở thành 7. |
8 | 9 | Các chuỗi được trích xuất một lần chỉ nội suy dấu nháy đơn kép [ 00], nhưng không phải là các chuỗi thoát truyền thống như 6. |
02 | 4 | 5 |
Các chuỗi chưa được trích dẫn được phân tích cú pháp theo nghĩa đen để các chuỗi thoát như
recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
6 trở thành recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
7.recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
8data structures in YAML
are essentially the same as in Perl, which was once a popular scripting language. They’re the following:
9 Simple values like numbers, strings, or Booleansrecursive: &cycle [*cycle] exercises: - muscles: &push-up - pectoral - triceps - biceps - muscles: &squat - glutes - quadriceps - hamstrings - muscles: &plank - abs - core - shoulders schedule: monday: - *push-up - *squat tuesday: - *plank wednesday: - *push-up - *plank
- Các chuỗi được trích xuất một lần chỉ nội suy dấu nháy đơn kép [
00], nhưng không phải là các chuỗi thoát truyền thống như{ "person": { "dateOfBirth": "1969-12-31", "firstName": "John", "lastName": "Doe", "married": true, "spouse": { "dateOfBirth": null, "firstName": "Jane", "lastName": "Doe" } } }
6. Sequences of scalars or other collectionsrecursive: &cycle [*cycle] exercises: - muscles: &push-up - pectoral - triceps - biceps - muscles: &squat - glutes - quadriceps - hamstrings - muscles: &plank - abs - core - shoulders schedule: monday: - *push-up - *squat tuesday: - *plank wednesday: - *push-up - *plank
02 Associative arrays, also known as maps, dictionaries, objects, or records comprised of key-value pairs{ "person": { "dateOfBirth": "1969-12-31", "firstName": "John", "lastName": "Doe", "married": true, "spouse": { "dateOfBirth": null, "firstName": "Jane", "lastName": "Doe" } } }
Các chuỗi được trích xuất kép [
recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
2] nội suy các chuỗi thoát nội suy như recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
6, {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
06 hoặc {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
07, được biết đến từ ngôn ngữ lập trình C, nhưng không phải là dấu nháy đơn kép [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
00].
Python | Sự mô tả |
4 | 5Before YAML 1.2: 14, 15, 16, 17]
|
Các chuỗi chưa được trích dẫn được phân tích cú pháp theo nghĩa đen để các chuỗi thoát như 6 trở thành 7. | 8Before YAML 1.2: 22]
|
9 | Các chuỗi được trích xuất một lần chỉ nội suy dấu nháy đơn kép [ 00], nhưng không phải là các chuỗi thoát truyền thống như 6. |
02 | Các chuỗi được trích xuất kép [ 2] nội suy các chuỗi thoát nội suy như 6, 06 hoặc 07, được biết đến từ ngôn ngữ lập trình C, nhưng không phải là dấu nháy đơn kép [ 00]. |
Don Tiết lo lắng nếu điều đó có vẻ khó hiểu. Dù sao, bạn cũng muốn chỉ định các chữ cái không được trích dẫn trong YAML. Một ngoại lệ đáng chú ý sẽ là khai báo một chuỗi mà trình phân tích cú pháp có thể giải thích sai là kiểu dữ liệu sai. Ví dụ, 09 được viết mà không có bất kỳ dấu ngoặc kép nào có thể được coi là một boolean python. | Ba cấu trúc dữ liệu cơ bản trong YAML về cơ bản giống như trong Perl, vốn từng là ngôn ngữ kịch bản phổ biến. Họ như sau: |
Scalars: Các giá trị đơn giản như số, chuỗi hoặc booleans
Mảng: Trình tự vô hướng hoặc các bộ sưu tập khác
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
Băm: mảng kết hợp, còn được gọi là bản đồ, từ điển, đối tượng hoặc hồ sơ bao gồm các cặp giá trị chính
Bạn có thể xác định một vô hướng YAML tương tự như một Python theo nghĩa đen tương ứng. Đây là vài ví dụ:property names, followed by a colon [
recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
0] and a value. You’ve seen a few examples of YAML hashes in this section already, but here’s a more involved one:person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
Loại dữ liệuanonymous objects, unlike, for example, the spouse defined under a property named
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
39. When anonymous or
unnamed objects appear as list items, you can recognize them by their properties, which are aligned with an opening dash character [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
37].Đương nhiên, bạn chỉ bị trầy xước bề mặt ở đây, vì YAML có rất nhiều tính năng nâng cao hơn nhiều để cung cấp. Bạn sẽ tìm hiểu về một số trong số họ bây giờ.
Các tính năng độc đáo
Trong phần này, bạn sẽ kiểm tra một số tính năng độc đáo nhất của YAML, bao gồm:
- Loại dữ liệu
- Tags
- Neo và bí danh
- Thuộc tính hợp nhất
- Phong cách dòng chảy và khối
- Các luồng nhiều tài liệu
Mặc dù XML là tất cả về văn bản và JSON kế thừa một vài loại dữ liệu của JavaScript, thì tính năng xác định của YAML, là tích hợp chặt chẽ với các hệ thống của các ngôn ngữ lập trình hiện đại. Ví dụ: bạn có thể sử dụng YAML để tuần tự hóa và giảm dần các loại dữ liệu được tích hợp vào Python, chẳng hạn như ngày và giờ:type systems of modern programming languages. For example, you can use YAML to serialize and deserialize data types built into Python, such as date and time:
30 | 42 |
28 | 44 |
45 | 46 |
47 | 48 |
YAML hiểu các định dạng ngày và thời gian khác nhau, bao gồm tiêu chuẩn ISO 8601 và có thể làm việc với các múi giờ tùy chọn. Các dấu thời gian như 23:59:59 bị hủy bỏ thành số giây trôi qua kể từ nửa đêm.
Để giải quyết các mơ hồ tiềm năng, bạn có thể chuyển các giá trị cho các loại dữ liệu cụ thể bằng cách sử dụng các thẻ YAML, bắt đầu với điểm nhấn hai dấu chấm câu [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
49]. Có một vài thẻ độc lập với ngôn ngữ, nhưng các trình phân tích cú pháp khác nhau có thể cung cấp các tiện ích mở rộng bổ sung chỉ liên quan đến ngôn ngữ lập trình của bạn. Ví dụ: thư viện mà bạn sẽ sử dụng sau này cho phép bạn chuyển đổi các giá trị thành các loại Python gốc và thậm chí tuần tự hóa các lớp tùy chỉnh của bạn:YAML tags, which start with the double exclamation point [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
49].
There are a few language-independent tags, but different parsers might provide additional extensions only relevant to your programming language. For example, the library that you’ll be using later lets you convert values to native Python types and even serialize your custom classes:text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
Việc sử dụng thẻ
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
50 bên cạnh đối tượng ngày làm cho YAML coi nó như một chuỗi thông thường. Dấu câu hỏi [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
51] biểu thị khóa ánh xạ trong YAML. Họ thường không cần thiết nhưng có thể giúp bạn xác định khóa ghép từ một bộ sưu tập khác hoặc một khóa chứa các ký tự dành riêng. Trong trường hợp này, bạn muốn xác định các khóa trống để tạo cấu trúc dữ liệu đã đặt, tương đương với ánh xạ mà không có các phím.Hơn nữa, bạn có thể sử dụng thẻ
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
52 để nhúng các tệp nhị phân được mã hóa cơ sở64 như hình ảnh hoặc các tài nguyên khác, sẽ trở thành trường hợp của {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
53 trong Python. Các thẻ có tiền tố với {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
54 được cung cấp bởi pyyaml.Tài liệu YAML ở trên sẽ chuyển thành từ điển Python sau:
{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
Lưu ý cách, với sự trợ giúp của các thẻ YAML, trình phân tích cú pháp đã biến các giá trị thuộc tính thành các loại dữ liệu Python khác nhau, bao gồm một chuỗi, một tập hợp, đối tượng byte, một tuple, một số phức và thậm chí là một thể hiện lớp tùy chỉnh.
Các tính năng mạnh mẽ khác của YAML là các neo và bí danh, cho phép bạn xác định một phần tử một lần và sau đó tham khảo nó nhiều lần trong cùng một tài liệu. Các trường hợp sử dụng tiềm năng bao gồm:anchors and aliases, which let you define an element once and then refer to it many times within the same document. Potential use cases include:
- Tái sử dụng địa chỉ vận chuyển để lập hóa đơn
- Bữa ăn xoay trong kế hoạch bữa ăn
- Các bài tập tham khảo trong một chương trình đào tạo
Để khai báo một mỏ neo, mà bạn có thể nghĩ là một biến được đặt tên, bạn đã sử dụng biểu tượng ampersand và
recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
Tại đây, bạn đã tạo ra một kế hoạch tập luyện từ các bài tập mà bạn đã xác định trước đó, lặp lại chúng trên các thói quen hàng ngày khác nhau. Ngoài ra, thuộc tính
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
57 thể hiện một ví dụ về một tham chiếu tròn. Thuộc tính này là một chuỗi có phần tử duy nhất là chính chuỗi. Nói cách khác, {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
58 giống như {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
57.Bạn cũng có thể hợp nhất [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
60] hoặc ghi đè các thuộc tính được xác định ở nơi khác bằng cách kết hợp hai hoặc nhiều đối tượng:merge [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
60] or override attributes defined elsewhere by combining two or more objects:{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
0Đối tượng
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
61 kế thừa các thuộc tính của {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
62 và {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
63 trong khi thêm một thuộc tính mới, {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
64 và thay đổi giá trị của {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
65.Scalars trong YAML hỗ trợ kiểu luồng hoặc kiểu khối, cung cấp cho bạn các mức độ kiểm soát khác nhau đối với việc xử lý dòng mới trong các chuỗi đa dòng. Flow Scalar có thể bắt đầu trên cùng một dòng với tên thuộc tính của chúng và có thể trải rộng nhiều dòng:flow style or a block style, which give you different levels of control over the newline handling in multiline strings. Flow scalars can start on the same line as their property name and may span multiple lines:
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
1Trong trường hợp như vậy, mỗi dòng sản phẩm nào dẫn đầu và dấu vết trắng sẽ luôn được gấp lại thành một không gian duy nhất, biến các đoạn văn thành các dòng. Điều này hoạt động hơi giống HTML hoặc Markdown, dẫn đến phần văn bản sau:
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
2Và, trong trường hợp bạn đang tự hỏi, Lorem Ipsum là một văn bản giữ chỗ phổ biến được sử dụng trong văn bản và thiết kế web để lấp đầy không gian có sẵn. Nó không mang theo bất kỳ ý nghĩa nào, vì nó có chủ ý vô nghĩa và được viết bằng tiếng Latin không đúng cách để cho phép bạn tập trung vào hình thức hơn là nội dung.
Trái ngược với vô hướng dòng chảy, khối vô hướng cho phép thay đổi cách đối phó với các đường mới, theo dõi Newlines hoặc thụt lề. Ví dụ: chỉ báo đường ống [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
66] được đặt ngay sau khi tên thuộc tính bảo tồn các bản mới theo nghĩa đen, có thể tiện dụng để nhúng các tập lệnh shell trong tệp yaml của bạn:{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
3Tài liệu YAML ở trên xác định một thuộc tính có tên
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
67, chứa một tập lệnh Python ngắn bao gồm một vài dòng mã. Không có chỉ báo đường ống, một trình phân tích cú pháp YAML sẽ coi các dòng sau đây là các yếu tố lồng nhau chứ không phải toàn bộ. Ansible là một ví dụ đáng chú ý tận dụng tính năng này của YAML.Nếu bạn muốn chỉ gấp các dòng với vết lõm được xác định bởi dòng đầu tiên trong một đoạn, thì hãy sử dụng chỉ báo lớn hơn dấu hiệu [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
68]:{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
4Điều này sẽ tạo ra đầu ra sau:
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
5Cuối cùng, bạn có thể có nhiều tài liệu YAML được lưu trữ trong một tệp được phân tách bằng Triple Dash [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
69]. Bạn có thể tùy chọn sử dụng Triple Dot [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
70] để đánh dấu phần cuối của mỗi tài liệu.Bắt đầu với Yaml trong Python
Như bạn đã học trong phần giới thiệu, làm việc với YAML trong Python yêu cầu một vài bước phụ vì ngôn ngữ không hỗ trợ định dạng dữ liệu này ra khỏi hộp. Bạn sẽ cần một thư viện của bên thứ ba để tuần tự hóa các đối tượng Python thành YAML và cách khác.
Ngoài ra, bạn có thể thấy hữu ích khi cài đặt các công cụ dòng lệnh này với PIP vào môi trường ảo của bạn để giúp gỡ lỗi:
- Yamllint: Một linter cho yaml, có thể kiểm tra cú pháp và hơn thế nữa A linter for YAML, which can check the syntax and more
- YQ: Bộ xử lý YAML dòng lệnh dựa trên JQ, để lọc dữ liệu A command-line YAML processor based on jq, for filtering data
- Shyaml: Bộ xử lý YAML dòng lệnh thay thế: An alternative command-line YAML processor
Đây là tất cả các công cụ Python, nhưng cũng có một triển khai GO của YQ, có giao diện dòng lệnh hơi khác. Nếu bạn có thể hoặc không muốn cài đặt các chương trình đó, thì bạn luôn có thể sử dụng một trong các công cụ có sẵn trực tuyến, chẳng hạn như:
- Yaml phân tích cú pháp
- Yaml định dạng
- Trình xác nhận YAML
Lưu ý rằng bạn chỉ cần một số công cụ đó trong tiểu mục sau, trong khi bạn sẽ bị ướt chân với YAML trong Python thuần túy cho phần còn lại của hướng dẫn này.
Tuần tự hóa tài liệu yaml dưới dạng json
Mặc dù Python không cung cấp một trình phân tích cú pháp YAML chuyên dụng hoặc trình tiếp xúc, bạn có thể vượt qua vấn đề này ở một mức độ nào đó với sự trợ giúp của mô-đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
71 tích hợp. Rốt cuộc, bạn đã học được rằng YAML là một Superset của JSON, vì vậy bạn có thể gửi dữ liệu của mình xuống định dạng JSON thông thường trong Python và mong đợi các trình phân tích cú pháp YAML bên ngoài chấp nhận nó.Đầu tiên, hãy tạo một tập lệnh Python mẫu để in ra JSON trên đầu ra tiêu chuẩn:
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
6Bạn tạo một từ điển và sau đó gọi
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
72 trên đó để kết xuất một chuỗi. Tham số {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
73 chỉ định một hàm để gọi khi Python có thể tuần tự hóa một đối tượng cho JSON, đó là trường hợp với ngày sinh trong ví dụ này. Hàm {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
74 tích hợp sẽ chuyển đổi đối tượng {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
75 thành chuỗi ISO 8601.Bây giờ, hãy chạy tập lệnh của bạn và cung cấp đầu ra của nó cho một trong các trình phân tích YAML dòng lệnh được đề cập trước đó, chẳng hạn như
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
76 hoặc {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
77, thông qua đường ống Unix [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
66]:{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
7Tốt đẹp! Cả hai trình phân tích cú pháp đã định dạng dữ liệu của bạn theo định dạng YAML chính tắc hơn mà không phàn nàn. Tuy nhiên, vì
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
76 là một trình bao bọc mỏng xung quanh JSON, ____ ____180, bạn phải yêu cầu nó thực hiện mã hóa với tùy chọn {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
81 và dấu chấm theo dõi làm biểu thức lọc. Ngoài ra, nhận thấy một sự khác biệt nhỏ trong thụt kết quả giữa {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
76 và {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
77.Được rồi, cảm giác như gian lận, và nó chỉ hoạt động theo một cách, vì bạn có thể đọc một tệp YAML trở lại Python bằng mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
71. Rất may, có nhiều cách để làm điều đó.Cài đặt thư viện pyyaml
Thư viện YAML của bên thứ ba phổ biến nhất của Python là Pyyaml, đây là một trong những gói hàng đầu được tải xuống từ PYPI. Nó có một giao diện trông hơi giống với mô-đun JSON tích hợp, nó được duy trì tích cực và nó có sự ban phước của trang web YAML chính thức, liệt kê nó cùng với một vài ứng cử viên ít phổ biến hơn.
Để cài đặt pyyaml vào môi trường ảo đang hoạt động của bạn, hãy nhập lệnh sau vào thiết bị đầu cuối của bạn:
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
8Thư viện được khép kín và không yêu cầu bất kỳ sự phụ thuộc nào nữa bởi vì nó được viết bằng Python thuần túy. Tuy nhiên, hầu hết các bản phân phối gói một ràng buộc c được biên dịch cho thư viện Libyaml, giúp Pyyaml chạy nhanh hơn nhiều. Để xác nhận nếu cài đặt pyyaml của bạn đi kèm với ràng buộc C, hãy mở trình thông dịch python tương tác và chạy đoạn mã này:
>>>
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
9Mặc dù Pyyaml là tên của thư viện bạn đã cài đặt, nhưng bạn sẽ nhập gói
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
85 trong mã Python. Ngoài ra, lưu ý rằng bạn cần yêu cầu rõ ràng rằng pyyaml tận dụng thư viện C được chia sẻ nhanh hơn đáng kể, nếu không nó sẽ quay trở lại mặc định là Python thuần túy. Đọc tiếp để tìm hiểu làm thế nào để thay đổi hành vi mặc định này.Mặc dù sự nổi tiếng của nó, Pyyaml có một số nhược điểm. Ví dụ: nếu bạn cần sử dụng các tính năng được giới thiệu trong YAML 1.2, chẳng hạn như tuân thủ JSON đầy đủ hoặc theo nghĩa đen an toàn hơn, thì bạn nên sử dụng thư viện Ruamel.yaml, có nguồn gốc từ phiên bản pyyaml cũ hơn. Như một phần thưởng, nó có thể thực hiện phân tích cú pháp khứ hồi để bảo tồn các ý kiến và định dạng ban đầu khi cần thiết.round-trip parsing to preserve the comments and original formatting when needed.
Mặt khác, nếu an toàn loại là mối quan tâm chính của bạn hoặc bạn muốn xác nhận các tài liệu YAML theo lược đồ, thì hãy xem xét Strictyaml, cố tình hạn chế đặc tả YAML bằng cách coi thường các tính năng rủi ro nhất của nó. Chỉ cần nhớ rằng nó đã giành chiến thắng chạy nhanh như hai thư viện khác.type safety is your main concern or you’d like to validate YAML documents against a schema, then have a look at StrictYAML, which intentionally restricts the YAML specification by disregarding its most risky features. Just keep in mind that it won’t run as quickly as the other two libraries.
Hiện tại, bạn sẽ gắn bó với Pyyaml cho phần còn lại của hướng dẫn này bởi vì nó là lựa chọn tiêu chuẩn cho hầu hết các dự án Python. Lưu ý rằng các công cụ được liệt kê trước đó, Kamllint, YQ và Shyaml, sử dụng pyyaml dưới bề mặt!
Đọc và viết tài liệu YAML đầu tiên của bạn
Giả sử bạn muốn đọc và phân tích một thông điệp email giả thuyết rằng mà đã được nối tiếp theo định dạng YAML và được lưu trữ trong một biến chuỗi trong Python:
>>>
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
0Cách nhanh nhất để giải phóng một mảnh YAML như vậy vào từ điển Python sẽ thông qua hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:>>>
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
1Cách nhanh nhất để giải phóng một mảnh YAML như vậy vào từ điển Python sẽ thông qua hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:untrusted sources, which could contain malicious code. YAML has an expressive
syntax full of convenient features, which unfortunately open the door to a host of vulnerabilities. You’ll learn more about exploiting YAML’s weaknesses later.Gọi
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
87 hiện là cách xử lý nội dung được khuyến nghị nhận được từ các nguồn không tin cậy, có thể chứa mã độc. YAML có một cú pháp biểu cảm đầy đủ các tính năng thuận tiện, không may mở ra cánh cửa cho một loạt các lỗ hổng. Bạn sẽ tìm hiểu thêm về việc khai thác điểm yếu của Yaml.shorthand functions that encapsulate the use of various YAML loader classes under the hood. In this case, that single function call translates to the following more explicit yet
equivalent code snippet:>>>
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
2Cách nhanh nhất để giải phóng một mảnh YAML như vậy vào từ điển Python sẽ thông qua hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:C implementation, then you must write a little bit of boilerplate code yourself:>>>
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
3Cách nhanh nhất để giải phóng một mảnh YAML như vậy vào từ điển Python sẽ thông qua hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:Gọi
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
87 hiện là cách xử lý nội dung được khuyến nghị nhận được từ các nguồn không tin cậy, có thể chứa mã độc. YAML có một cú pháp biểu cảm đầy đủ các tính năng thuận tiện, không may mở ra cánh cửa cho một loạt các lỗ hổng. Bạn sẽ tìm hiểu thêm về việc khai thác điểm yếu của Yaml.>>>
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
4Cách nhanh nhất để giải phóng một mảnh YAML như vậy vào từ điển Python sẽ thông qua hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:Gọi {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
87 hiện là cách xử lý nội dung được khuyến nghị nhận được từ các nguồn không tin cậy, có thể chứa mã độc. YAML có một cú pháp biểu cảm đầy đủ các tính năng thuận tiện, không may mở ra cánh cửa cho một loạt các lỗ hổng. Bạn sẽ tìm hiểu thêm về việc khai thác điểm yếu của Yaml.
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
Hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
87 là một trong một số hàm tốc ký gói gọn việc sử dụng các lớp Trình tải YAML khác nhau dưới mui xe. Trong trường hợp này, cuộc gọi hàm duy nhất đó chuyển sang đoạn mã mã tương đương rõ ràng hơn sau:Một điều cần nhớ khi sử dụng các chức năng tốc ký là chúng mã hóa việc thực hiện Python thuần túy. Nếu bạn muốn sử dụng triển khai C nhanh hơn, thì bạn phải tự viết một chút mã Boilerplate:
Đầu tiên, bạn thử nhập một trong các lớp Trình tải có tiền tố với chữ C để biểu thị việc sử dụng ràng buộc thư viện C. Nếu thất bại, thì bạn nhập một lớp tương ứng được triển khai trong Python. Thật không may, điều này làm cho mã của bạn trông dài hơn và ngăn bạn sử dụng các chức năng phím tắt được đề cập.
Bạn đã tuần tự hóa một đối tượng Python cho YAML trước khi lạm dụng mô-đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
71 tích hợp, nhưng kết quả không phải là một hình thức kinh điển của YAML. Bây giờ, bạn sẽ tận dụng thư viện Pyyaml của bên thứ ba được cài đặt để khắc phục điều này. Có một hàm {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
90 tương ứng, lấy một đối tượng Python và biến nó thành một chuỗi. Bạn có thể cung cấp cho nó đầu ra của {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86 để đảo ngược quá trình phân tích cú pháp:
Chọn lớp Trình tải | Nếu bạn muốn hiệu suất phân tích cú pháp tốt nhất có thể, thì bạn sẽ cần nhập thủ công lớp Trình tải phù hợp và chuyển nó đến hàm 93 chung, như được hiển thị trước đó. Nhưng bạn nên chọn cái nào? | Để tìm hiểu, hãy xem tổng quan cấp cao này về các trình tải theo ý của bạn. Các mô tả ngắn gọn sẽ cho bạn một ý tưởng chung về các lựa chọn có sẵn: |
Lớp tải | Nếu bạn muốn hiệu suất phân tích cú pháp tốt nhất có thể, thì bạn sẽ cần nhập thủ công lớp Trình tải phù hợp và chuyển nó đến hàm 93 chung, như được hiển thị trước đó. Nhưng bạn nên chọn cái nào? | Để tìm hiểu, hãy xem tổng quan cấp cao này về các trình tải theo ý của bạn. Các mô tả ngắn gọn sẽ cho bạn một ý tưởng chung về các lựa chọn có sẵn: |
Lớp tải | Hàm số | Sự mô tả |
94 | - | Chỉ hỗ trợ các thẻ YAML tiêu chuẩn như 50 và không xây dựng các phiên bản lớp |
05 | 06 | Có thể tải hầu hết tất cả yaml một cách an toàn |
Ba trình tải mà bạn có thể sử dụng rất có thể sử dụng có các hàm tốc ký tương ứng mà bạn có thể gọi thay vì chuyển một lớp Trình tải đến hàm
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
93 chung. Hãy nhớ rằng, tất cả đều được viết bằng Python, vì vậy để có hiệu suất được cải thiện, bạn sẽ cần nhập một lớp Trình tải phù hợp có tiền tố với chữ C, chẳng hạn như %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
08 và dù sao thì hãy gọi {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
93.Để biết phân tích chi tiết hơn về các tính năng được hỗ trợ bởi các lớp Trình tải riêng lẻ, hãy xem bảng bên dưới:
99 [ 98] | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
05 | ✔ | ✔ | ✔ | ✔ | lỗi | lỗi |
02 | ✔ | ✔ | lỗi | ✔ | lỗi | lỗi |
02 | ✔ | lỗi | lỗi | lỗi | lỗi | lỗi |
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
02{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
94
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
phớt lờanchors and aliases example:
99 hỗ trợ tất cả các tính năng có sẵn và cho phép thực thi mã tùy ý. {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
05 tương tự ngoại trừ việc thực thi mã và khả năng khử các lớp Python tùy chỉnh, gây ra lỗi phân tích cú pháp. %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
02 Ngoài ra các lỗi trên các thẻ cụ thể của Python được cung cấp bởi Pyyaml, chẳng hạn như %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
18. Mặt khác, %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
94 vẫn là bất khả tri về hầu hết các tính năng bằng cách bỏ qua chúng.{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
5So sánh các tính năng của bộ tải
Dưới đây, bạn sẽ nhận được một cuộc biểu tình nhanh chóng về các tính năng được đề cập ở trên. Đầu tiên, nhập mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
85 và kiểm tra ví dụ neo và bí danh:YAML tags in action:
99 hỗ trợ tất cả các tính năng có sẵn và cho phép thực thi mã tùy ý. {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
05 tương tự ngoại trừ việc thực thi mã và khả năng khử các lớp Python tùy chỉnh, gây ra lỗi phân tích cú pháp. %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
02 Ngoài ra các lỗi trên các thẻ cụ thể của Python được cung cấp bởi Pyyaml, chẳng hạn như %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
18. Mặt khác, %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
94 vẫn là bất khả tri về hầu hết các tính năng bằng cách bỏ qua chúng.{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
6So sánh các tính năng của bộ tải
Dưới đây, bạn sẽ nhận được một cuộc biểu tình nhanh chóng về các tính năng được đề cập ở trên. Đầu tiên, nhập mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
85 và kiểm tra ví dụ neo và bí danh:PyYAML tags, which are provided by the library, use either %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
05 or {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
99 because they’re the only loaders that can handle Python-specific tags:
99 hỗ trợ tất cả các tính năng có sẵn và cho phép thực thi mã tùy ý. {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
05 tương tự ngoại trừ việc thực thi mã và khả năng khử các lớp Python tùy chỉnh, gây ra lỗi phân tích cú pháp. %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
02 Ngoài ra các lỗi trên các thẻ cụ thể của Python được cung cấp bởi Pyyaml, chẳng hạn như %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
18. Mặt khác, %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
94 vẫn là bất khả tri về hầu hết các tính năng bằng cách bỏ qua chúng.{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
7So sánh các tính năng của bộ tải
Dưới đây, bạn sẽ nhận được một cuộc biểu tình nhanh chóng về các tính năng được đề cập ở trên. Đầu tiên, nhập mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
85 và kiểm tra ví dụ neo và bí danh:auxiliary types, which are
more specific than a basic string, list, or dictionary:
99 hỗ trợ tất cả các tính năng có sẵn và cho phép thực thi mã tùy ý. {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
05 tương tự ngoại trừ việc thực thi mã và khả năng khử các lớp Python tùy chỉnh, gây ra lỗi phân tích cú pháp. %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
02 Ngoài ra các lỗi trên các thẻ cụ thể của Python được cung cấp bởi Pyyaml, chẳng hạn như %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
18. Mặt khác, %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
94 vẫn là bất khả tri về hầu hết các tính năng bằng cách bỏ qua chúng.{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
8So sánh các tính năng của bộ tải
Dưới đây, bạn sẽ nhận được một cuộc biểu tình nhanh chóng về các tính năng được đề cập ở trên. Đầu tiên, nhập mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
85 và kiểm tra ví dụ neo và bí danh:custom class from YAML, make a function call in your Python code, or
even execute a shell command while parsing YAML. In that case, your only option is the {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
99, which accepts a few special library tags. The other loaders either raise an exception or ignore those tags. You’ll learn more about the PyYAML tags now.>>>
Bạn xác định một mỏ neo,
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
21, gần địa chỉ vận chuyển và sau đó sử dụng lại cùng một địa chỉ cho hóa đơn với sự trợ giúp của bí danh, %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
22. Kết quả là, bạn chỉ phải chỉ định địa chỉ một lần. Tính năng này hoạt động với tất cả các loại trình tải.Ví dụ tiếp theo cho thấy một trong các thẻ YAML tiêu chuẩn trong hành động:
- Các chữ số như
23 được coi là phao theo mặc định, nhưng bạn có thể yêu cầu chuyển đổi loại thành chuỗi với thẻ{ "person": { "dateOfBirth": "1969-12-31", "firstName": "John", "lastName": "Doe", "married": true, "spouse": { "dateOfBirth": null, "firstName": "Jane", "lastName": "Doe" } } }
50. Hầu như tất cả các trình tải đều tôn trọng thẻ yaml tiêu chuẩn. Ngoại lệ duy nhất là lớp{ "person": { "dateOfBirth": "1969-12-31", "firstName": "John", "lastName": "Doe", "married": true, "spouse": { "dateOfBirth": null, "firstName": "Jane", "lastName": "Doe" } } }
94, đại diện cho vô hướng với các chuỗi dù bạn có gắn thẻ chúng hay không.{ "person": { "dateOfBirth": "1969-12-31", "firstName": "John", "lastName": "Doe", "married": true, "spouse": { "dateOfBirth": null, "firstName": "Jane", "lastName": "Doe" } } }
38%YAML 1.2 --- person: dateOfBirth: 1969-12-31 firstName: John lastName: Doe married: true spouse: dateOfBirth: null # This is a comment firstName: Jane lastName: Doe
39%YAML 1.2 --- person: dateOfBirth: 1969-12-31 firstName: John lastName: Doe married: true spouse: dateOfBirth: null # This is a comment firstName: Jane lastName: Doe
Để tận dụng các thẻ pyyaml, được cung cấp bởi thư viện, sử dụng
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
05 hoặc {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
99 vì chúng là bộ tải duy nhất có thể xử lý các thẻ cụ thể của Python:%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
9Thẻ
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
18 trong ví dụ trên chuyển đổi một danh sách nội tuyến thành một tuple python. Truy cập tài liệu Pyyaml để biết danh sách đầy đủ các thẻ được hỗ trợ, nhưng hãy chắc chắn kiểm tra chéo bằng mã nguồn trên GitHub, vì tài liệu có thể không được cập nhật.Hầu hết các trình tải đều thông minh về việc khử vô hướng thành các loại phụ trợ, cụ thể hơn một chuỗi cơ bản, danh sách hoặc từ điển: từ điển:
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
0Cả hai kiểu đều đạt được hiệu ứng tương tự bằng cách gọi phương thức
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
44 trong lớp %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
47 với hai giá trị được truyền dưới dạng đối số vị trí. Ngoài ra, bạn có thể sử dụng cú pháp dài dòng hơn một chút cho phép bạn trộn các đối số từ khóa và vị trí, trong số một vài thủ thuật nâng cao hơn được che đậy cho sự ngắn gọn:grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
1Điều này vẫn sẽ gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
44 trên lớp của bạn, nhưng một trong những đối số sẽ được truyền như một đối số từ khóa. Trong mọi trường hợp, bạn có thể xác định lớp %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
47 theo cách thủ công hoặc bằng cách tận dụng các lớp dữ liệu trong Python:grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
2Cú pháp ngắn gọn này sẽ làm cho Python tạo ra bộ khởi tạo lớp cũng như một vài phương pháp khác mà bạn phải tự mã hóa.
Lưu ý rằng bạn có thể sử dụng
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
39 đối với bất kỳ đối tượng có thể gọi nào, bao gồm các chức năng thông thường và chỉ định các đối số để vượt qua. Điều này cho phép bạn thực thi một trong các hàm tích hợp, hàm tùy chỉnh hoặc thậm chí là hàm cấp mô-đun, mà Pyyaml sẽ vui vẻ nhập cho bạn. Đó là một lỗ hổng bảo mật khổng lồ! Hãy tưởng tượng bằng cách sử dụng mô -đun %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
51 hoặc %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
52 để chạy lệnh shell truy xuất khóa SSH riêng tư của bạn nếu bạn đã xác định một:callable object, including regular functions, and specify the arguments to pass. This lets you execute one of the built-in functions, a custom function, or even a module-level
function, which PyYAML will happily import for you. That’s a huge security hole! Imagine using the %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
51 or %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
52 module to run a shell command that retrieves your private SSH key if you’ve defined one:>>>
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
3Nó không khó để thực hiện yêu cầu HTTP với dữ liệu bị đánh cắp thông qua mạng khi đối tượng được tạo. Một diễn viên xấu có thể sử dụng thông tin này để truy cập các tài nguyên nhạy cảm bằng danh tính của bạn.
Đôi khi, các thẻ này bỏ qua đường dẫn tạo đối tượng bình thường, điển hình của các cơ chế tuần tự hóa đối tượng nói chung. Giả sử bạn muốn tải đối tượng người dùng từ YAML và biến nó thành một thể hiện của lớp sau:
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
4Bạn đặt lớp
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
53 trong một tệp nguồn riêng biệt có tên %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
54 để giữ mọi thứ được tổ chức. Đối tượng người dùng chỉ có một thuộc tính tên của tên. Bằng cách chỉ sử dụng một thuộc tính và triển khai trình khởi tạo một cách rõ ràng, bạn sẽ có thể quan sát cách Pyyaml gọi các phương thức riêng lẻ.Khi bạn quyết định sử dụng thẻ
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
37 trong YAML, thì thư viện gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
43 mà không có bất kỳ đối số nào và không bao giờ gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
44. Thay vào đó, nó trực tiếp điều khiển thuộc tính %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
58 của đối tượng mới được tạo của bạn, có thể có một số hiệu ứng không mong muốn:>>>
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
5Nó không khó để thực hiện yêu cầu HTTP với dữ liệu bị đánh cắp thông qua mạng khi đối tượng được tạo. Một diễn viên xấu có thể sử dụng thông tin này để truy cập các tài nguyên nhạy cảm bằng danh tính của bạn.
Đôi khi, các thẻ này bỏ qua đường dẫn tạo đối tượng bình thường, điển hình của các cơ chế tuần tự hóa đối tượng nói chung. Giả sử bạn muốn tải đối tượng người dùng từ YAML và biến nó thành một thể hiện của lớp sau:
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
6Bạn đặt lớp
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
53 trong một tệp nguồn riêng biệt có tên %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
54 để giữ mọi thứ được tổ chức. Đối tượng người dùng chỉ có một thuộc tính tên của tên. Bằng cách chỉ sử dụng một thuộc tính và triển khai trình khởi tạo một cách rõ ràng, bạn sẽ có thể quan sát cách Pyyaml gọi các phương thức riêng lẻ.Khi bạn quyết định sử dụng thẻ
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
37 trong YAML, thì thư viện gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
43 mà không có bất kỳ đối số nào và không bao giờ gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
44. Thay vào đó, nó trực tiếp điều khiển thuộc tính %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
58 của đối tượng mới được tạo của bạn, có thể có một số hiệu ứng không mong muốn:grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
7Mặc dù bạn chắc chắn đã tạo ra một thể hiện
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
53 mới, nhưng nó đã được khởi tạo đúng, bởi vì thuộc tính %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
60 bị thiếu. Tuy nhiên, nó có một %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
61 bất ngờ, nơi không tìm thấy trong cơ thể lớp.Bạn có thể khắc phục điều này bằng cách thêm khai báo
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
62 vào lớp của bạn, điều này cấm thêm hoặc xóa các thuộc tính một cách linh hoạt khi đối tượng tồn tại trong bộ nhớ:>>>
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
8Nó không khó để thực hiện yêu cầu HTTP với dữ liệu bị đánh cắp thông qua mạng khi đối tượng được tạo. Một diễn viên xấu có thể sử dụng thông tin này để truy cập các tài nguyên nhạy cảm bằng danh tính của bạn.
Đôi khi, các thẻ này bỏ qua đường dẫn tạo đối tượng bình thường, điển hình của các cơ chế tuần tự hóa đối tượng nói chung. Giả sử bạn muốn tải đối tượng người dùng từ YAML và biến nó thành một thể hiện của lớp sau:
72%YAML 1.2 --- person: dateOfBirth: 1969-12-31 firstName: John lastName: Doe married: true spouse: dateOfBirth: null # This is a comment firstName: Jane lastName: Doe
73%YAML 1.2 --- person: dateOfBirth: 1969-12-31 firstName: John lastName: Doe married: true spouse: dateOfBirth: null # This is a comment firstName: Jane lastName: Doe
Bạn đặt lớp
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
53 trong một tệp nguồn riêng biệt có tên %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
54 để giữ mọi thứ được tổ chức. Đối tượng người dùng chỉ có một thuộc tính tên của tên. Bằng cách chỉ sử dụng một thuộc tính và triển khai trình khởi tạo một cách rõ ràng, bạn sẽ có thể quan sát cách Pyyaml gọi các phương thức riêng lẻ.Khi bạn quyết định sử dụng thẻ %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
37 trong YAML, thì thư viện gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
43 mà không có bất kỳ đối số nào và không bao giờ gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
44. Thay vào đó, nó trực tiếp điều khiển thuộc tính %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
58 của đối tượng mới được tạo của bạn, có thể có một số hiệu ứng không mong muốn:
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
Mặc dù bạn chắc chắn đã tạo ra một thể hiện
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
53 mới, nhưng nó đã được khởi tạo đúng, bởi vì thuộc tính %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
60 bị thiếu. Tuy nhiên, nó có một %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
61 bất ngờ, nơi không tìm thấy trong cơ thể lớp.>>>
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
9Theo thông số kỹ thuật YAML 1.2, trình phân tích cú pháp nên hỗ trợ Unicode được mã hóa với UTF-8, UTF-16 hoặc UTF-32 để tương thích với JSON. Tuy nhiên, vì thư viện PYYAML chỉ hỗ trợ YAML 1.1, các tùy chọn duy nhất của bạn là UTF-8 và UTF-16:
>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
0Nếu bạn thử tải YAML từ một văn bản được mã hóa bằng UTF-32, thì bạn sẽ gặp lỗi. Tuy nhiên, điều đó hầu như không phải là vấn đề trong thực tế bởi vì UTF-32 không phải là một mã hóa phổ biến. Trong mọi trường hợp, bạn luôn có thể thực hiện mã hóa thích hợp bằng cách sử dụng các phương thức Python,
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
76 và %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
77 trước khi tải YAML. Ngoài ra, bạn có thể thử một trong các thư viện phân tích YAML khác được đề cập trước đó.Bạn cũng có thể đọc nội dung YAML trực tiếp từ một tệp. Đi trước và tạo một tệp có nội dung yaml mẫu trong đó và tải nó vào python bằng pyyaml:
>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
1Bạn tạo một tệp cục bộ có tên
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
78 trong thư mục làm việc hiện tại của bạn và viết mười bốn byte đại diện cho một tài liệu YAML mẫu. Tiếp theo, bạn mở tệp đó để đọc và sử dụng {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
87 để có được một từ điển tương ứng. Tệp có thể được mở ở chế độ văn bản hoặc nhị phân. Trên thực tế, bạn có thể vượt qua bất kỳ luồng ký tự hoặc byte giống như tệp nào như bộ đệm văn bản IO.Stringio trong bộ nhớ hoặc luồng io.Bytesio nhị phân:>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
2Như bạn có thể thấy, các chức năng tải trong pyyaml khá linh hoạt. So sánh điều này với mô -đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
71, cung cấp các chức năng khác nhau tùy thuộc vào loại đối số đầu vào của bạn. Tuy nhiên, các gói pyyaml khác một bộ chức năng khác có thể giúp bạn đọc nhiều tài liệu từ một luồng. Bạn sẽ tìm hiểu về các chức năng đó bây giờ.Tải nhiều tài liệu
Tất cả bốn chức năng tải trong pyyaml đều có các đối tác có thể lặp lại, có thể đọc nhiều tài liệu YAML từ một luồng. Họ vẫn mong đợi chính xác một đối số, nhưng thay vì ngay lập tức phân tích nó vào một đối tượng Python, họ quấn nó bằng trình lặp máy phát mà bạn có thể lặp lại:
>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
3Các tài liệu riêng lẻ phải bắt đầu bằng một dấu gạch ngang ba [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
69] và có thể tùy ý kết thúc bằng ba chấm [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
70].Trong phần này, bạn đã tìm hiểu về các hàm cấp cao có sẵn trong pyyaml để tải tài liệu với. Thật không may, họ cố gắng đọc toàn bộ luồng một cách háo hức trong một lần, điều này luôn luôn khả thi. Đọc các tệp khổng lồ theo cách như vậy có thể mất quá nhiều thời gian hoặc thậm chí thất bại do bộ nhớ hạn chế. Nếu bạn muốn xử lý YAML theo kiểu phát trực tuyến tương tự như giao diện SAX trong XML, thì bạn phải sử dụng API cấp thấp do PyyamL cung cấp.
Việc đổ các đối tượng python vào tài liệu yaml
Nếu bạn đã làm việc với JSON trong Python trước đó, thì việc tuần tự hóa hoặc bán phá giá các đối tượng Python Python cho YAML sẽ trông quen thuộc hơn là tải chúng. Thư viện Pyyaml có một giao diện mà có phần giống với mô-đun
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
71 tích hợp. Nó cũng cung cấp ít các lớp Dumper và chức năng trình bao bọc hơn so với các trình tải để lựa chọn, vì vậy bạn không cần phải tung hứng nhiều tùy chọn đó.Chọn lớp Dumper
Chức năng tuần tự hóa YAML xung quanh trong pyyaml là
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84, lấy một lớp Dumper tùy chọn làm đối số. Nếu bạn không chỉ định một trong một cuộc gọi chức năng, thì nó sẽ quay trở lại bằng cách sử dụng %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
85 giàu tính năng nhất. Các lựa chọn khác như sau:
86 | 87 | Không hỗ trợ bất kỳ thẻ nào và chỉ hữu ích cho phân lớp |
88 | 92 | Chỉ tạo ra các thẻ YAML tiêu chuẩn như 50 và có thể đại diện cho các trường hợp lớp, làm cho nó tương thích hơn với các trình phân tích cú pháp YAML khác |
91 | 92 | Hỗ trợ tất cả các thẻ tiêu chuẩn, thư viện và tùy chỉnh và có thể tuần tự hóa một đối tượng Python tùy ý, vì vậy nó có thể tạo ra một tài liệu mà các trình phân tích viên YAML khác đã giành được tải trọng |
Trong thực tế, lựa chọn thực sự mà bạn có sẽ nằm trong khoảng từ
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
91 và %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
88 vì %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
86 chỉ được dự định là một lớp cơ sở để các lớp con mở rộng. Nói chung, bạn sẽ muốn gắn bó với %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
85 mặc định trong hầu hết các trường hợp trừ khi bạn cần sản xuất YAML di động mà không có những điều kỳ quặc cụ thể của Python.Một lần nữa, hãy nhớ nhập lớp Dumper tương ứng có tiền tố với chữ C cho hiệu suất tuần tự hóa tốt nhất và hãy nhớ rằng có thể có sự khác biệt nhỏ giữa các triển khai Python và C:
>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
4Ví dụ, máy xúc tác Python thuần túy bổ sung các chấm tùy chọn ở cuối tài liệu YAML, trong khi một lớp trình bao bọc tương tự cho thư viện Libyaml không có. Tuy nhiên, đây là những khác biệt về mỹ phẩm không có tác động thực sự đối với dữ liệu nối tiếp hoặc giải phóng.
Đổ vào chuỗi, tệp hoặc luồng
Sê -ri JSON trong Python yêu cầu bạn phải lựa chọn giữa việc gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
97 hoặc {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
72 tùy thuộc vào nơi bạn muốn nội dung bị đổ. Mặt khác, Pyyaml cung cấp chức năng bán phá giá hai trong một, hoạt động khác nhau tùy thuộc vào cách bạn gọi nó:>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
5Khi được gọi với một đối số duy nhất, hàm trả về một chuỗi đại diện cho đối tượng tuần tự hóa. Tuy nhiên, bạn có thể tùy chọn chuyển một đối số thứ hai để chỉ định luồng mục tiêu để ghi vào. Nó có thể là một tệp hoặc bất kỳ đối tượng giống như tệp. Khi bạn vượt qua đối số tùy chọn này, hàm trả về
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
30 và bạn cần trích xuất dữ liệu từ luồng khi cần thiết.Nếu bạn muốn đổ YAML của mình vào một tệp, thì hãy chắc chắn mở tệp ở chế độ ghi. Ngoài ra, bạn phải chỉ định mã hóa ký tự thông qua đối số từ khóa tùy chọn cho hàm
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 khi tệp được mở ở chế độ nhị phân:write mode. Additionally, you must specify the character encoding through an optional keyword argument to the %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 function when the file is open in binary mode:>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
6Khi bạn mở một tệp ở chế độ văn bản, thì nó luôn luôn là một thực tiễn tốt để thiết lập rõ ràng mã hóa ký tự. Mặt khác, Python sẽ giả sử mã hóa mặc định nền tảng của bạn, có thể ít di động hơn. Mã hóa ký tự không có ý nghĩa trong chế độ nhị phân, liên quan đến các byte đã được mã hóa. Tuy nhiên, bạn nên đặt mã hóa thông qua hàm
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84, chấp nhận nhiều tham số tùy chọn hơn mà bạn sẽ sớm tìm hiểu.Đổ nhiều tài liệu
Hai hàm làm giảm YAML trong Pyyaml,
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
92 và {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
92, không có cách nào để biết liệu bạn có muốn tuần tự hóa nhiều tài liệu riêng biệt hoặc một tài liệu duy nhất bao gồm một chuỗi phần tử:>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
7Họ luôn cho rằng cái sau, bán một tài liệu YAML duy nhất với một danh sách các yếu tố. Để đổ nhiều tài liệu, hãy sử dụng
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
04 hoặc grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
05:>>>
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
8Bây giờ bạn nhận được một chuỗi chứa nhiều hơn một tài liệu YAML được phân tách bằng Triple Dash [
{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
69].Lưu ý rằng
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
04 là chức năng duy nhất được sử dụng dưới mui xe vì tất cả các hàm khác, bao gồm %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
92 và {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
92, xử lý đại biểu cho nó. Vì vậy, bất kể bạn gọi chức năng nào, tất cả đều có cùng danh sách các tham số chính thức.Điều chỉnh định dạng với các tham số tùy chọn
Các chức năng bán phá giá trong pyyaml chấp nhận một vài đối số vị trí và một số đối số từ khóa tùy chọn, cho phép bạn kiểm soát định dạng đầu ra. Tham số duy nhất được yêu cầu là đối tượng Python hoặc một chuỗi các đối tượng để tuần tự hóa, được truyền như là đối số đầu tiên trong tất cả các chức năng bán phá giá. Bạn sẽ xem xét kỹ hơn các tham số có sẵn trong phần này.
Ba giấy gói ủy quyền cho
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
10 có chữ ký chức năng sau, tiết lộ các đối số vị trí của họ:grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
9Hàm đầu tiên mong đợi giữa một và ba đối số vị trí vì hai trong số chúng có các giá trị tùy chọn. Mặt khác, hàm thứ hai và thứ ba được liệt kê ở trên chỉ mong đợi hai đối số vị trí vì cả hai đều sử dụng
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
88 được xác định trước. Để tìm các đối số từ khóa có sẵn, bạn phải xem chữ ký của hàm grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
10.Bạn có thể sử dụng cùng một đối số từ khóa trên cả bốn chức năng bán phá giá. Chúng có tất cả các tùy chọn vì chúng có các giá trị mặc định bằng
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
30 hoặc grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
14, ngoại trừ đối số grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
15, có giá trị mặc định là {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
09. Tổng cộng, có sáu lá cờ Boolean mà bạn có thể bật và tắt để thay đổi giao diện của YAML kết quả:
17 | Don Tiết thoát Unicode và don don kép. |
18 | Đầu ra yaml ở dạng kinh điển. |
19 | Thích phong cách dòng chảy hơn phong cách khối. |
20 | Kết thúc mỗi tài liệu bằng dấu chấm ba [ 70]. |
22 | Bắt đầu mỗi tài liệu với Triple Dash [ 69]. |
15 | Sắp xếp đầu ra của từ điển theo khóa. |
Ngoài ra còn có một số tham số của các loại dữ liệu khác cho phép bạn tự do hơn:
17 | Don Tiết thoát Unicode và don don kép. | 18 |
Đầu ra yaml ở dạng kinh điển. | Don Tiết thoát Unicode và don don kép. | 18 |
Đầu ra yaml ở dạng kinh điển. | 19 | Thích phong cách dòng chảy hơn phong cách khối. |
20 | 19 | Thích phong cách dòng chảy hơn phong cách khối. |
20 | 19 | Thích phong cách dòng chảy hơn phong cách khối. |
20 | Kết thúc mỗi tài liệu bằng dấu chấm ba [ 70]. | 22 |
Bắt đầu mỗi tài liệu với Triple Dash [ 69]. | 15 | Sắp xếp đầu ra của từ điển theo khóa. |
Ngoài ra còn có một số tham số của các loại dữ liệu khác cho phép bạn tự do hơn:tag handles to valid URI prefixes recognized by a YAML parser:
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
0Tham số
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
1Bằng cách sử dụng chỉ thị
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
49 phía trên tài liệu YAML, bạn khai báo một tay cầm thẻ tùy chỉnh có tên grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
50, được mở rộng thành tiền tố sau. Điểm cảm thán kép [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
49] là một lối tắt tích hợp cho không gian tên mặc định tương ứng với tiền tố grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
52.Bạn có thể thử nghiệm các đối số từ khóa có sẵn bằng cách thay đổi giá trị của chúng và chạy lại mã của bạn để xem kết quả. Tuy nhiên, điều này nghe có vẻ như một nhiệm vụ tẻ nhạt. Các tài liệu hỗ trợ cho hướng dẫn này đi kèm với một ứng dụng tương tác cho phép bạn kiểm tra các kết hợp đối số và giá trị của chúng khác nhau trong trình duyệt web:
Nó có một trang web động sử dụng JavaScript để liên lạc qua mạng với một máy chủ HTTP tối thiểu được viết bằng Fastapi. Máy chủ mong đợi một đối tượng JSON với tất cả trừ đối số từ khóa
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
43 và gọi %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 đối với đối tượng thử nghiệm sau:fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
2Đối tượng mẫu ở trên là một từ điển bao gồm các trường số nguyên và chuỗi, chứa các ký tự Unicode. Để chạy máy chủ, trước tiên bạn phải cài đặt thư viện Fastapi và máy chủ Web ASGI như Uvicorn vào môi trường ảo của bạn, nơi bạn đã cài đặt Pyyaml trước đó:
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
3Để chạy máy chủ, bạn phải cung cấp tên mô-đun theo sau là dấu hai chấm và tên của tiếng gọi tương thích ASGI trong mô-đun đó. Các chi tiết của việc triển khai máy chủ như vậy và một khách hàng vượt xa phạm vi của hướng dẫn này, nhưng hãy thoải mái tải xuống các tài liệu mẫu để tự nghiên cứu:
Tiếp theo, bạn sẽ tìm hiểu thêm về việc bán phá giá các lớp tùy chỉnh với pyyaml.
Kết xuất các loại dữ liệu tùy chỉnh
Như bạn đã biết, tại thời điểm này, bạn có thể sử dụng một trong các thẻ cụ thể của Python do Pyyaml cung cấp để tuần tự hóa và giải phóng các đối tượng của các loại dữ liệu tùy chỉnh của bạn, chẳng hạn như các lớp. Bạn cũng biết rằng các thẻ đó chỉ được công nhận bởi các bộ tải và máy đổ không an toàn, cho phép thực thi mã nguy hiểm rõ ràng. Thư viện sẽ từ chối tuần tự hóa một loại cụ thể của Python như một số phức tạp trừ khi bạn chọn lớp Dumper không an toàn:
>>>
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
4Trong trường hợp đầu tiên, máy đẩy an toàn không biết cách biểu diễn số phức của bạn trong YAML. Mặt khác, gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 hoàn toàn sử dụng lớp grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
56 không an toàn phía sau hậu trường, tận dụng thẻ grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
57. Đó là một câu chuyện tương tự khi bạn cố gắng đổ một lớp tùy chỉnh:>>>
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
5Trong trường hợp đầu tiên, máy đẩy an toàn không biết cách biểu diễn số phức của bạn trong YAML. Mặt khác, gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 hoàn toàn sử dụng lớp grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
56 không an toàn phía sau hậu trường, tận dụng thẻ grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
57. Đó là một câu chuyện tương tự khi bạn cố gắng đổ một lớp tùy chỉnh:>>>
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
6Trong trường hợp đầu tiên, máy đẩy an toàn không biết cách biểu diễn số phức của bạn trong YAML. Mặt khác, gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 hoàn toàn sử dụng lớp grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
56 không an toàn phía sau hậu trường, tận dụng thẻ grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
57. Đó là một câu chuyện tương tự khi bạn cố gắng đổ một lớp tùy chỉnh:>>>
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
7Trong trường hợp đầu tiên, máy đẩy an toàn không biết cách biểu diễn số phức của bạn trong YAML. Mặt khác, gọi
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 hoàn toàn sử dụng lớp grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
56 không an toàn phía sau hậu trường, tận dụng thẻ grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
57. Đó là một câu chuyện tương tự khi bạn cố gắng đổ một lớp tùy chỉnh:Tùy chọn duy nhất của bạn là %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
84 không an toàn. Tuy nhiên, nó có thể đánh dấu các lớp của bạn là an toàn để phân tích để ngay cả bộ tải an toàn cũng có thể xử lý chúng sau này. Để làm điều đó, bạn phải thực hiện một vài thay đổi cho lớp học của mình:
%YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
Đầu tiên, hãy để lớp kế thừa từ
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
59. Sau đó chỉ định hai thuộc tính lớp. Một thuộc tính sẽ đại diện cho thẻ YAML tùy chỉnh gắn với lớp của bạn, trong khi loại thứ hai sẽ là lớp Trình tải để sử dụng. Bây giờ, khi bạn đổ một đối tượng %YAML 1.2
---
person:
dateOfBirth: 1969-12-31
firstName: John
lastName: Doe
married: true
spouse:
dateOfBirth: null # This is a comment
firstName: Jane
lastName: Doe
47 cho YAML, bạn sẽ có thể tải lại với {
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
86:Toán tử Walrus [
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
62] cho phép bạn xác định một biến và sử dụng nó làm đối số cho hàm grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
63 trong một bước. Đánh dấu các lớp học an toàn là một sự thỏa hiệp tốt đẹp, cho phép bạn đưa ra ngoại lệ cho một số lớp học của bạn bằng cách loại bỏ bảo mật và cho chúng vào. Đương nhiên, bạn phải hoàn toàn chắc chắn rằng không có gì đáng ngờ về chúng trước khi bạn thử tải YAML liên quan.
Trong những trường hợp hiếm hoi đó, thư viện phơi bày các hoạt động bên trong của nó cho bạn thông qua một số chức năng cấp thấp. Có bốn cách để đọc một luồng yaml: | Chức năng đọc | Giá trị trả về |
64 | Mã thông báo | Giá trị trả về |
64 | Mã thông báo | |
✔ | 65 | Giá trị trả về |
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
64streaming fashion, which wasn’t possible up to this point. You’ll learn about the differences between tokens, events, and nodes a bit later.Mã thông báo
66 | Mã thông báo | ✔ |
65 | Mã thông báo | ✔ |
65 | 65 | Sự kiện |
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
66Trong phần này, bạn sẽ thực hiện ba ví dụ thực hành về các chức năng cấp thấp này trong pyyaml. Hãy nhớ rằng bạn có thể tải xuống mã nguồn của họ bằng cách theo liên kết bên dưới:
Tokenize một tài liệu yaml
Bạn sẽ nhận được điều khiển chi tiết nhất bằng cách quét tài liệu YAML để có được một luồng mã thông báo. Mỗi mã thông báo có một ý nghĩa duy nhất và cho bạn biết nơi nó bắt đầu và nơi nó kết thúc, bao gồm cả dòng chính xác và số cột, cũng như phần bù từ đầu tài liệu:
>>>
fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
8Các thuộc tính mã thông báo
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
75 và grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
76 chứa tất cả các thông tin liên quan. Điều đó hoàn hảo nếu bạn muốn triển khai plugin YAML Cú pháp Highlighter cho Trình chỉnh sửa mã yêu thích của bạn chẳng hạn. Trên thực tế, tại sao bạn không đi trước và xây dựng một công cụ dòng lệnh trần để in nội dung yaml bằng màu?Đầu tiên, bạn cần thu hẹp các loại mã thông báo, vì bạn sẽ chỉ quan tâm đến việc tô màu các giá trị vô hướng, các khóa ánh xạ và thẻ YAML. Tạo một tệp mới có tên
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
77 và đặt chức năng sau trong đó:fruits: [apple, banana, orange]
veggies:
- tomato
- cucumber
- onion
mushrooms:
- champignon
- truffle
9Nó có một trình bao bọc mỏng xung quanh chức năng Pyyaml, ____364, tạo ra các bộ dữ liệu bao gồm chỉ số bắt đầu, chỉ số cuối và một phiên bản mã thông báo. Ở đây, một sự cố chi tiết hơn:
- Dòng 6 xác định một biến để giữ thể hiện mã thông báo cuối cùng. Chỉ có các mã thông báo vô hướng và thẻ chứa một giá trị, vì vậy bạn phải nhớ bối cảnh của chúng ở đâu đó để chọn đúng màu sau này. Giá trị ban đầu tính đến khi tài liệu chỉ chứa một vô hướng không có bất kỳ bối cảnh nào. defines a variable to hold the last token instance. Only the scalar and tag tokens contain a value, so you must remember their context somewhere to choose the right color later. The initial value accounts for when the document contains only a scalar without any context.
- Dòng 7 vòng trên các mã thông báo được quét. loops over the scanned tokens.
- Các dòng 8 và 9 trích xuất vị trí mã thông báo trong văn bản từ các điểm đánh dấu chỉ mục có sẵn trên tất cả các mã thông báo. Vị trí mã thông báo được phân định bằng
79 vàgrandparent: parent: child: name: Bobby sibling: name: Molly
80. extract the token’s position within the text from the index markers available on all tokens. The token’s position is delimited withgrandparent: parent: child: name: Bobby sibling: name: Molly
79 andgrandparent: parent: child: name: Bobby sibling: name: Molly
80.grandparent: parent: child: name: Bobby sibling: name: Molly
- Các dòng 10 đến 13 Kiểm tra loại mã thông báo hiện tại và mang lại các chỉ số và một phiên bản mã thông báo. Nếu mã thông báo là một thẻ, thì nó sẽ được mang lại. Nếu mã thông báo là vô hướng, thì
81 được mang lại vì vô hướng có thể xuất hiện trong các bối cảnh khác nhau và bạn cần biết bối cảnh hiện tại là gì để chọn màu phù hợp. check the current token type and yield the indices and a token instance. If the token is a tag, then it gets yielded. If the token is a scalar, thengrandparent: parent: child: name: Bobby sibling: name: Molly
81 is yielded because scalars can appear in different contexts, and you need to know what the current context is to select the appropriate color.grandparent: parent: child: name: Bobby sibling: name: Molly
- Các dòng 14 và 15 cập nhật bối cảnh nếu mã thông báo hiện tại là khóa ánh xạ hoặc giá trị. Các loại mã thông báo khác bị bỏ qua, vì chúng không có một biểu diễn trực quan có ý nghĩa. update the context if the current token is either a mapping key or a value. Other token types get ignored, as they don’t have a meaningful visual representation.
Khi bạn nhập chức năng của mình vào phiên phiên dịch Python tương tác, thì bạn sẽ có thể bắt đầu lặp lại trên tập hợp con của mã thông báo với các chỉ số có liên quan của chúng:
>>>
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
0Các thuộc tính mã thông báo
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
75 và grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
76 chứa tất cả các thông tin liên quan. Điều đó hoàn hảo nếu bạn muốn triển khai plugin YAML Cú pháp Highlighter cho Trình chỉnh sửa mã yêu thích của bạn chẳng hạn. Trên thực tế, tại sao bạn không đi trước và xây dựng một công cụ dòng lệnh trần để in nội dung yaml bằng màu?
Dòng 7 vòng trên các mã thông báo được quét. | Các dòng 8 và 9 trích xuất vị trí mã thông báo trong văn bản từ các điểm đánh dấu chỉ mục có sẵn trên tất cả các mã thông báo. Vị trí mã thông báo được phân định bằng 79 và 80. | Các dòng 10 đến 13 Kiểm tra loại mã thông báo hiện tại và mang lại các chỉ số và một phiên bản mã thông báo. Nếu mã thông báo là một thẻ, thì nó sẽ được mang lại. Nếu mã thông báo là vô hướng, thì 81 được mang lại vì vô hướng có thể xuất hiện trong các bối cảnh khác nhau và bạn cần biết bối cảnh hiện tại là gì để chọn màu phù hợp. |
Các dòng 14 và 15 cập nhật bối cảnh nếu mã thông báo hiện tại là khóa ánh xạ hoặc giá trị. Các loại mã thông báo khác bị bỏ qua, vì chúng không có một biểu diễn trực quan có ý nghĩa. | Khi bạn nhập chức năng của mình vào phiên phiên dịch Python tương tác, thì bạn sẽ có thể bắt đầu lặp lại trên tập hợp con của mã thông báo với các chỉ số có liên quan của chúng: | Gọn gàng! Bạn có thể tận dụng các bộ dữ liệu này để chú thích các mã thông báo trong văn bản gốc bằng thư viện bên thứ ba hoặc chuỗi thoát ANSI miễn là thiết bị đầu cuối của bạn hỗ trợ chúng. Dưới đây là một vài màu mẫu với trình tự thoát của chúng: |
Màu sắc | Khi bạn nhập chức năng của mình vào phiên phiên dịch Python tương tác, thì bạn sẽ có thể bắt đầu lặp lại trên tập hợp con của mã thông báo với các chỉ số có liên quan của chúng: | Gọn gàng! Bạn có thể tận dụng các bộ dữ liệu này để chú thích các mã thông báo trong văn bản gốc bằng thư viện bên thứ ba hoặc chuỗi thoát ANSI miễn là thiết bị đầu cuối của bạn hỗ trợ chúng. Dưới đây là một vài màu mẫu với trình tự thoát của chúng: |
Màu sắc
Trọng lượng phông chữ
Trình tự thoát
Màu xanh da trời
In đậm
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
2grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
82
Cyan
Thường xuyên
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
3grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
83Phân tích một dòng sự kiện
Một giao diện cấp thấp khác được cung cấp bởi Pyyaml là API phát trực tuyến hướng sự kiện, hoạt động tương tự như Sax trong XML. Nó dịch YAML thành một chuỗi các sự kiện được kích hoạt bởi các yếu tố riêng lẻ. Các sự kiện được đánh giá uể oải mà không tải toàn bộ tài liệu vào bộ nhớ. Bạn có thể nghĩ về nó như nhìn trộm qua một cửa sổ đang di chuyển.event-driven streaming API, which works similarly to SAX in XML. It translates YAML into a flat sequence of events triggered by the individual elements. The events are evaluated lazily without loading the entire document into memory. You can think of it as peeking through a moving window.
Điều này có thể giúp bỏ qua các giới hạn bộ nhớ mà bạn có thể phải đối mặt khi cố gắng đọc một tệp lớn. Nó cũng có thể tăng tốc đáng kể khi tìm kiếm một thông tin rất cụ thể trong đại dương tiếng ồn. Ngoài ra, phát trực tuyến cho phép có thể xây dựng một đại diện thay thế cho dữ liệu của bạn. Trong phần này, bạn sẽ tạo một người xây dựng HTML để trực quan hóa yaml một cách thô thiển.
Khi bạn phân tích một tài liệu với pyyaml, thư viện sẽ mang lại một chuỗi các sự kiện:
>>>
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
4Như bạn có thể thấy, có nhiều loại sự kiện tương ứng với các yếu tố khác nhau trong tài liệu YAML. Một số sự kiện đó phơi bày các thuộc tính bổ sung, mà bạn có thể kiểm tra để tìm hiểu thêm về yếu tố trong tay.
Bạn có thể tưởng tượng làm thế nào những sự kiện này có thể dịch một cách tự nhiên sang mở và đóng các thẻ bằng ngôn ngữ đánh dấu phân cấp như HTML. Ví dụ: bạn có thể đại diện cho cấu trúc trên với đoạn đánh dấu sau:
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
5Một mục danh sách duy nhất được bao bọc giữa các thẻ
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
93 và grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
94, trong khi ánh xạ giá trị khóa tận dụng lợi thế của danh sách mô tả [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
95], chứa các thuật ngữ xen kẽ [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
96] và định nghĩa [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
97]. Đây là phần khó khăn vì nó yêu cầu đếm các sự kiện YAML tiếp theo ở cấp độ làm tổ nhất định để xác định xem một sự kiện sẽ trở thành một thuật ngữ hay định nghĩa trong HTML.Cuối cùng, bạn muốn thiết kế một lớp
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
98 để giúp bạn phân tích nhiều tài liệu YAML từ một luồng một cách lười biếng. Giả sử bạn đã xác định một lớp như vậy, bạn có thể tạo chức năng trợ giúp sau trong một tệp có tên grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
99:person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
6Mã các vòng lặp qua một chuỗi các sự kiện phân tích cú pháp và đưa chúng cho lớp của bạn, dịch YAML thành HTML bằng cách tăng dần đại diện của nó. Khi hàm phát hiện phần cuối của tài liệu YAML trong một luồng, nó sẽ mang lại một đoạn HTML và tạo một trình xây dựng trống mới để bắt đầu lại. Điều đó tránh bị chặn trong quá trình xử lý một luồng tài liệu YAML có khả năng dài vô hạn, có thể đến qua dây:
>>>
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
7Như bạn có thể thấy, có nhiều loại sự kiện tương ứng với các yếu tố khác nhau trong tài liệu YAML. Một số sự kiện đó phơi bày các thuộc tính bổ sung, mà bạn có thể kiểm tra để tìm hiểu thêm về yếu tố trong tay.
Bạn có thể tưởng tượng làm thế nào những sự kiện này có thể dịch một cách tự nhiên sang mở và đóng các thẻ bằng ngôn ngữ đánh dấu phân cấp như HTML. Ví dụ: bạn có thể đại diện cho cấu trúc trên với đoạn đánh dấu sau:
Một mục danh sách duy nhất được bao bọc giữa các thẻ
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
93 và grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
94, trong khi ánh xạ giá trị khóa tận dụng lợi thế của danh sách mô tả [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
95], chứa các thuật ngữ xen kẽ [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
96] và định nghĩa [grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
97]. Đây là phần khó khăn vì nó yêu cầu đếm các sự kiện YAML tiếp theo ở cấp độ làm tổ nhất định để xác định xem một sự kiện sẽ trở thành một thuật ngữ hay định nghĩa trong HTML.Cuối cùng, bạn muốn thiết kế một lớp
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
98 để giúp bạn phân tích nhiều tài liệu YAML từ một luồng một cách lười biếng. Giả sử bạn đã xác định một lớp như vậy, bạn có thể tạo chức năng trợ giúp sau trong một tệp có tên grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
99:Mã các vòng lặp qua một chuỗi các sự kiện phân tích cú pháp và đưa chúng cho lớp của bạn, dịch YAML thành HTML bằng cách tăng dần đại diện của nó. Khi hàm phát hiện phần cuối của tài liệu YAML trong một luồng, nó sẽ mang lại một đoạn HTML và tạo một trình xây dựng trống mới để bắt đầu lại. Điều đó tránh bị chặn trong quá trình xử lý một luồng tài liệu YAML có khả năng dài vô hạn, có thể đến qua dây:
Ví dụ trên cho thấy một luồng bao gồm ba tài liệu YAML, mà hàm trợ giúp biến thành các đoạn HTML riêng biệt. Bây giờ bạn đã hiểu hành vi mong đợi, đó là thời gian để thực hiện lớp
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
98.Phương thức khởi tạo trong lớp xây dựng của bạn sẽ xác định hai trường riêng để theo dõi bối cảnh hiện tại và nội dung HTML được xây dựng cho đến nay:
person:
firstName: John
lastName: Doe
dateOfBirth: 1969-12-31
married: true
spouse:
firstName: Jane
lastName: Smith
children:
- firstName: Bobby
dateOfBirth: 1995-01-17
- firstName: Molly
dateOfBirth: 2001-05-14
8- Bối cảnh là một ngăn xếp được thực hiện dưới dạng danh sách Python, lưu trữ số lượng các cặp giá trị khóa trên cấp độ đã cho cho đến nay. Ngăn xếp cũng có thể chứa các dấu hiệu danh sách chỉ ra trạng thái giữa
01 vàgrandparent: parent: child: {name: Bobby} sibling: {'name': "Molly"}
02. Trường khác là danh sách các thẻ HTML và nội dung của chúng, được tham gia bởi một tài sản lớp công khai. import the needed event types from PyYAML.grandparent: parent: child: {name: Bobby} sibling: {'name': "Molly"}
- Có một số ít các sự kiện YAML mà bạn sẽ muốn xử lý: specify the event types corresponding to HTML opening and closing tags.
9 append the corresponding HTML tag and update the stack as necessary.person: firstName: John lastName: Doe dateOfBirth: 1969-12-31 married: true spouse: firstName: Jane lastName: Smith children: - firstName: Bobby dateOfBirth: 1995-01-17 - firstName: Molly dateOfBirth: 2001-05-14
- Bạn bắt đầu xử lý một sự kiện bằng cách kiểm tra xem có bất kỳ thẻ mở nào trên ngăn xếp đang chờ một số hành động không. Bạn ủy thác kiểm tra này cho một phương thức trợ giúp khác,
03, mà bạn sẽ thêm sau. Sau đó, bạn nối thẻ HTML tương ứng với sự kiện hiện tại và một lần nữa cập nhật bối cảnh. open or close pending tags on the stack and optionally update the number of key-value pairs processed.grandparent: parent: child: {name: Bobby} sibling: {'name': "Molly"}
Tại đây, một dòng nhanh chóng của đoạn trích trên đoạn trên:
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
0Dòng 5 đến 11 Nhập các loại sự kiện cần thiết từ Pyyaml.
Dòng 13 và 14 chỉ định các loại sự kiện tương ứng với các thẻ mở và đóng HTML.
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
1Các dòng 24 đến 37 nối thẻ HTML tương ứng và cập nhật ngăn xếp khi cần thiết.
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
2Lệnh
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
05 nên hoạt động trên tất cả các hệ điều hành chính. Nó in một đoạn văn bản trong thiết bị đầu cuối, bạn có thể kết nối với một đường ống lệnh khác bằng cách sử dụng ký tự thanh dọc [{
"person": {
"dateOfBirth": "1969-12-31",
"firstName": "John",
"lastName": "Doe",
"married": true,
"spouse": {
"dateOfBirth": null,
"firstName": "Jane",
"lastName": "Doe"
}
}
}
66]. Trong trường hợp này, bạn xử lý một tài liệu YAML ngắn với tập lệnh grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
99 của bạn và sau đó chuyển đổi HTML kết quả thành một biểu mẫu văn bản đơn giản mà bạn có thể xem trước trong thiết bị đầu cuối mà không cần bắt đầu trình duyệt web đầy đủ.Nhấp vào phần thu gọn bên dưới để tiết lộ mã nguồn đầy đủ:
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
3Bạn đã làm rất tốt! Bây giờ bạn có thể trực quan hóa yaml trong trình duyệt web của bạn. Tuy nhiên, bài thuyết trình là tĩnh. Sẽ là tốt đẹp để gia vị nó với một chút tương tác? Tiếp theo, bạn sẽ sử dụng một cách tiếp cận khác để phân tích cú pháp YAML, điều này sẽ cho phép điều đó!
Xây dựng một cây các nút
Đôi khi bạn cần phải có toàn bộ tài liệu được giữ trong bộ nhớ để nhìn về phía trước và đưa ra quyết định sáng suốt dựa trên những gì tiếp theo. Pyyaml có thể xây dựng một biểu diễn đối tượng của hệ thống phân cấp phần tử YAML giống với DOM trong XML. Bằng cách gọi
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
66, bạn sẽ nhận được nút gốc của cây phần tử:>>>
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
4Rễ có thể đi qua cú pháp ngoặc vuông. Bạn có thể tiếp cận với bất kỳ phần tử hậu duệ nào trong cây bằng cách sử dụng thuộc tính và đăng ký của Node
>>>
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
5Rễ có thể đi qua cú pháp ngoặc vuông. Bạn có thể tiếp cận với bất kỳ phần tử hậu duệ nào trong cây bằng cách sử dụng thuộc tính và đăng ký của Node
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
6Vì chỉ có ba loại nút [
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
10, grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
11 và grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
12], bạn có thể tự động hóa đường truyền của chúng với chức năng đệ quy:Đặt chức năng này trong tập lệnh Python có tên
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
13, vì bạn sẽ phát triển mã. Hàm có một nút duy nhất và, tùy thuộc vào loại của nó, trả về giá trị của nó hoặc nhập vào một cây con có liên quan. Lưu ý rằng các phím ánh xạ cũng phải được truy cập, vì chúng có thể là các giá trị phi Scalar trong YAML.>>>
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
7Rễ có thể đi qua cú pháp ngoặc vuông. Bạn có thể tiếp cận với bất kỳ phần tử hậu duệ nào trong cây bằng cách sử dụng thuộc tính và đăng ký của NodeYAML global tags, such as
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
15, so you may extract the last bit after the second colon [recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
0].Vì chỉ có ba loại nút [
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
10, grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
11 và grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
12], bạn có thể tự động hóa đường truyền của chúng với chức năng đệ quy:text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
8Đặt chức năng này trong tập lệnh Python có tên
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
13, vì bạn sẽ phát triển mã. Hàm có một nút duy nhất và, tùy thuộc vào loại của nó, trả về giá trị của nó hoặc nhập vào một cây con có liên quan. Lưu ý rằng các phím ánh xạ cũng phải được truy cập, vì chúng có thể là các giá trị phi Scalar trong YAML.>>>
text: !!str 2022-01-16
numbers: !!set
? 5
? 8
? 13
image: !!binary
R0lGODdhCAAIAPAAAAIGAfr4+SwAA
AAACAAIAAACDIyPeWCsClxDMsZ3CgA7
pair: !!python/tuple
- black
- white
center_at: !!python/complex 3.14+2.72j
person: !!python/object:package_name.module_name.ClassName
age: 42
first_name: John
last_name: Doe
9Rễ có thể đi qua cú pháp ngoặc vuông. Bạn có thể tiếp cận với bất kỳ phần tử hậu duệ nào trong cây bằng cách sử dụng thuộc tính và đăng ký của Node
{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
0Vì chỉ có ba loại nút [
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
10, grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
11 và grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
12], bạn có thể tự động hóa đường truyền của chúng với chức năng đệ quy:Đặt chức năng này trong tập lệnh Python có tên
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
13, vì bạn sẽ phát triển mã. Hàm có một nút duy nhất và, tùy thuộc vào loại của nó, trả về giá trị của nó hoặc nhập vào một cây con có liên quan. Lưu ý rằng các phím ánh xạ cũng phải được truy cập, vì chúng có thể là các giá trị phi Scalar trong YAML.{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
1Sau đó, nhập chức năng của bạn vào phiên phiên dịch Python tương tác và cung cấp cho nó một ổ đĩa thử nghiệm so với phần tử gốc mà bạn đã tạo trước đó:
Kết quả là bạn nhận được một danh sách python, nhưng các giá trị vô hướng riêng lẻ có trong đó là tất cả các chuỗi. Pyyaml phát hiện kiểu dữ liệu được liên kết với giá trị vô hướng và lưu trữ nó trong thuộc tính nút ____ ____414, nhưng bạn phải tự mình thực hiện việc tự xử lý. Các loại được mã hóa bằng các thẻ YAML Global, chẳng hạn như
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
15, do đó bạn có thể trích xuất bit cuối cùng sau đại tràng thứ hai [recursive: &cycle [*cycle]
exercises:
- muscles: &push-up
- pectoral
- triceps
- biceps
- muscles: &squat
- glutes
- quadriceps
- hamstrings
- muscles: &plank
- abs
- core
- shoulders
schedule:
monday:
- *push-up
- *squat
tuesday:
- *plank
wednesday:
- *push-up
- *plank
0].{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
2Sửa đổi chức năng của bạn bằng cách gói giá trị trả về của vô hướng bằng một cuộc gọi đến hàm
grandparent:
parent:
child: {name: Bobby}
sibling: {'name': "Molly"}
17 mới:Khi bạn chạy tập lệnh dựa trên một số dữ liệu kiểm tra, thì nó sẽ xuất ra một đoạn mã HTML mà bạn có thể chuyển hướng đến một tệp cục bộ mà bạn có thể mở với trình duyệt web mặc định của mình:
- các cửa sổ
- Linux
- hệ điều hành Mac
{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
3{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
4{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
5Trang kết quả sẽ cho phép bạn mở rộng và thu gọn các cặp giá trị khóa riêng lẻ tương tác khi được xem trước trong trình duyệt web:
Cây HTML tương tác của các nút YAML
Lưu ý cách trình duyệt web hiển thị hình ảnh được mã hóa cơ sở64 mô tả khuôn mặt cười. Bạn sẽ tìm thấy mã cuối cùng trong phần thu gọn bên dưới:
{
"text": "2022-01-16",
"numbers": {8, 13, 5},
"image": b"GIF87a\x08\x00\x08\x00\xf0\x00…",
"pair": ["black", "white"],
"center_at": [3.14+2.72j],
"person":
}
6Được rồi, đó là tất cả khi nói đến việc phân tích các tài liệu YAML ở cấp độ thấp bằng thư viện Pyyaml. Các hàm
grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
69 và grandparent:
parent:
child:
name: Bobby
sibling:
name: Molly
71 tương ứng hoạt động theo cách khác bằng cách thực hiện một chuỗi các sự kiện hoặc nút gốc, và biến chúng thành một biểu diễn YAML. Nhưng bạn hiếm khi cần sử dụng chúng.Sự kết luận
Bây giờ bạn đã biết nơi để tìm pin bị thiếu trong Python để đọc và viết tài liệu YAML. Bạn đã tạo ra một cú pháp YAML Cú pháp Highlighter và bản xem trước YAML tương tác trong HTML. Trên đường đi, bạn đã tìm hiểu về các tính năng mạnh mẽ và nguy hiểm được tìm thấy trong định dạng dữ liệu phổ biến này và cách tận dụng chúng với Python.
Trong hướng dẫn này, bạn đã học được cách:
- Đọc và viết tài liệu YAML bằng Python and write YAML documents in Python
- Nối tiếp hóa các loại dữ liệu tùy chỉnh và tích hợp Python Python’s built-in and custom data types to YAML
- Đọc một cách an toàn các tài liệu YAML từ các nguồn không đáng tin cậy read YAML documents from untrusted sources
- Kiểm soát các tài liệu yaml phân tích cú pháp ở cấp thấp hơnparsing YAML documents at a lower-level
Để lấy mã nguồn cho các ví dụ trong hướng dẫn này, hãy theo liên kết dưới đây: