Hướng dẫn how does python yaml file work? - tệp python yaml hoạt động như thế nào?

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:

XMLJsonYaml
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:

YamlPythonSự mô tả
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
4
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
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
8
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
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 [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
00], nhưng không phải là các chuỗi thoát truyền thống 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"
        }
    }
}
02
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
4
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
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:

  1. 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
    
    9
    Simple values like numbers, strings, or Booleans
  2. Các chuỗi được trích xuất một lần chỉ nội suy 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], nhưng không phải là các chuỗi thoát truyền thống 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.
    Sequences of scalars or other collections
  3. {
        "person": {
            "dateOfBirth": "1969-12-31",
            "firstName": "John",
            "lastName": "Doe",
            "married": true,
            "spouse": {
                "dateOfBirth": null,
                "firstName": "Jane",
                "lastName": "Doe"
            }
        }
    }
    
    02
    Associative arrays, also known as maps, dictionaries, objects, or records comprised of key-value pairs

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].

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ụ,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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.Yaml
PythonSự mô tả
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
4
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
5Before YAML 1.2:
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
14,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
15,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
16,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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ư
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
8Before YAML 1.2:
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
22]
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
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 [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
00], nhưng không phải là các chuỗi thoát truyền thống 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"
        }
    }
}
02
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].
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ụ,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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:

YamlPython
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
30
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
42
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
28
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
44
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
45
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
46
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
47
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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"
        }
    }
}
1

Trong 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"
        }
    }
}
2

Và, 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"
        }
    }
}
3

Tà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"
        }
    }
}
5

Cuố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"
        }
    }
}
6

Bạ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"
        }
    }
}
7

Tố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"
        }
    }
}
8

Thư 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"
        }
    }
}
9

Mặ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
0

Cá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
1

Cá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
2

Cá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
3

Cá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
4

Cá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.

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:

Kết quả là một đối tượng chuỗi với tin nhắn email của bạn đã tuần tự hóa thành YAML một lần nữa. Tuy nhiên, nó không hoàn toàn giống YAML mà ban đầu bạn bắt đầu. Như bạn có thể thấy,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
92 đã sắp xếp các phím từ điển cho bạn, trích dẫn các chuỗi đa dòng và sử dụng một vết lõm hơi khác. Bạn có thể thay đổi một số điều này và áp dụng nhiều tinh chỉnh hơn vào định dạng thông qua một số đối số từ khóa mà bạn sẽ khám phá trong một trong các phần sắp tới.Đang tải các tài liệu yaml trong PythonĐang tải YAML sôi sục để đọc một đoạn văn bản và phân tích nó theo định dạng dữ liệu ngữ pháp. Pyyaml ​​có thể làm cho điều này trở nên khó hiểu do rất nhiều chức năng và các lớp để lựa chọn. Thêm vào đó, tài liệu thư viện không đáng tin cậy giải thích rõ ràng sự khác biệt và các trường hợp sử dụng hợp lệ của họ. Để cứu bạn khỏi việc gỡ lỗi mã cơ bản, bạn sẽ tìm thấy các sự kiện quan trọng nhất về việc tải tài liệu với pyyaml ​​trong phần này.
Chọn lớp Trình tảiNế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
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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ảiNế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
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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ảiHàm sốSự mô tả
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
94
-Chỉ hỗ trợ các thẻ YAML tiêu chuẩn như
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
50 và không xây dựng các phiên bản 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
05
%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
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:

Lớp tảiNeo, bí danhThẻ yamlThẻ pyyamlCác loại phụ trợCác loại tùy chỉnhThực thi mã
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
99 [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
98]
%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
lỗilỗ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
lỗilỗilỗ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
lỗilỗilỗilỗilỗ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

phớt lờanchors and aliases example:

{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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 ý.
%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 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,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "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.

%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
5

So 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:

{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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 ý.
%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 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,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "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.

%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
6

So 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:

{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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 ý.
%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 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,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "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.

%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
7

So 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:

{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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 ý.
%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 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,
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "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.

%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
8

So 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ư
    {
        "person": {
            "dateOfBirth": "1969-12-31",
            "firstName": "John",
            "lastName": "Doe",
            "married": true,
            "spouse": {
                "dateOfBirth": null,
                "firstName": "Jane",
                "lastName": "Doe"
            }
        }
    }
    
    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.
  • %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
    
    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

Để 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
9

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
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
0

Cả 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
2

Cú 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
3

Nó 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
4

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:

>>>

grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
5

Nó 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
6

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:

grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
7

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.

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
8

Nó 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:

  • %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
    
    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

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:

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
9

Theo 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"}
0

Nế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"}
1

Bạ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"}
2

Như 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"}
3

Cá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:

Lớp họcHàm sốSự 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
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
87
Không hỗ trợ bất kỳ thẻ nào và chỉ hữu ích cho phân 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
88
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
92
Chỉ tạo ra các thẻ YAML tiêu chuẩn như
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
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
%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
%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
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"}
4

Ví 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"}
5

Khi đượ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"}
6

Khi 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"}
7

Họ 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"}
8

Bâ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"}
9

Hà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ả:

Cờ BooleanNghĩa
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
17
Don Tiết thoát Unicode và don don kép.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
18
Đầu ra yaml ở dạng kinh điển.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
19
Thích phong cách dòng chảy hơn phong cách khối.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
20
Kết thúc mỗi tài liệu bằng dấu chấm ba [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
70].
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
22
Bắt đầu mỗi tài liệu với Triple Dash [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
69].
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
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:

Tham sốLoại hìnhNghĩa
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
17
Don Tiết thoát Unicode và don don kép.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
18
Đầu ra yaml ở dạng kinh điển.Don Tiết thoát Unicode và don don kép.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
18
Đầu ra yaml ở dạng kinh điển.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
19
Thích phong cách dòng chảy hơn phong cách khối.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
20
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
19
Thích phong cách dòng chảy hơn phong cách khối.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
20
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
19
Thích phong cách dòng chảy hơn phong cách khối.
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
20
Kết thúc mỗi tài liệu bằng dấu chấm ba [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
70].
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
22
Bắt đầu mỗi tài liệu với Triple Dash [
{
    "person": {
        "dateOfBirth": "1969-12-31",
        "firstName": "John",
        "lastName": "Doe",
        "married": true,
        "spouse": {
            "dateOfBirth": null,
            "firstName": "Jane",
            "lastName": "Doe"
        }
    }
}
69].
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
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
0

Tham số

fruits: [apple, banana, orange]
veggies:
  - tomato
  - cucumber
  - onion
mushrooms:
- champignon
- truffle
1

Bằ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
4

Trong 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
5

Trong 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
6

Trong 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
7

Trong 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:

Đầ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.

Phân tích cú pháp tài liệu yaml ở mức thấpCác lớp và một vài chức năng trình bao bọc mà bạn đã sử dụng cho đến nay tạo thành giao diện Pyyaml ​​cấp cao, ẩn các chi tiết triển khai làm việc với các tài liệu YAML. Điều này bao gồm hầu hết các trường hợp sử dụng và cho phép bạn tập trung vào dữ liệu hơn là trình bày của nó. Tuy nhiên, đôi khi bạn có thể muốn kiểm soát nhiều hơn đối với các quá trình phân tích cú pháp và tuần tự hóa.Lazy?
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 đọcGiá trị trả về
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
64
Mã thông báoGiá trị trả về
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
64
Mã thông báo
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
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

grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
65Sự kiện
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
66
Mã thông báo
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
65
Mã thông báo
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
65
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
65
Sự kiện

grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
66

Trong 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
8

Cá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
9

Nó 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
    grandparent:
      parent:
        child:
          name: Bobby
        sibling:
          name: Molly
    
    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 with
    grandparent:
      parent:
        child:
          name: Bobby
        sibling:
          name: Molly
    
    79 and
    grandparent:
      parent:
        child:
          name: Bobby
        sibling:
          name: Molly
    
    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ì
    grandparent:
      parent:
        child:
          name: Bobby
        sibling:
          name: Molly
    
    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, then
    grandparent:
      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.
  • 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
0

Cá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 đó:Nó 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.
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
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
79 và
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
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ì
grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
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ắcKhi 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
2

grandparent:
  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
3

grandparent:
  parent:
    child:
      name: Bobby
    sibling:
      name: Molly
83

Phâ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
4

Như 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
5

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:

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
6

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:

>>>

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
7

Như 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
    grandparent:
      parent:
        child: {name: Bobby}
        sibling: {'name': "Molly"}
    
    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.
  • 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.
  • 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
    
    9
    append the corresponding HTML tag and update the stack as necessary.
  • 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,
    grandparent:
      parent:
        child: {name: Bobby}
        sibling: {'name': "Molly"}
    
    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.

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
0

Dò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
1

Cá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
2

Lệ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
3

Bạ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
4

Rễ 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
5

Rễ 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
6

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:

Đặ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
7

Rễ 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
9

Rễ 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": 
}
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:

Đặ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": 
}
1

Sau đó, 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": 
}
2

Sử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": 
}
5

Trang 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:

Tập tin Python Yaml hoạt động như thế nào?

YAML tự nhiên hỗ trợ ba loại dữ liệu cơ bản: vô hướng [như chuỗi, số nguyên và phao], danh sách và mảng kết hợp. Phần mở rộng tên tệp được đề xuất chính thức cho các tệp YAML đã được. Yaml. Có hai mô -đun trong Python cho Yaml: Pyyaml ​​và Ruamel.There are two modules in Python for YAML: PyYAML and ruamel.

Các tệp yaml được định dạng như thế nào?

Định dạng nội tuyến tùy chọn được phân định bởi dấu phẩy+không gian và được đặt trong ngoặc [tương tự như JSON].Các phím được tách ra khỏi các giá trị bằng không gian đại tràng+.Các khối thụt lề, phổ biến trong các tệp dữ liệu YAML, sử dụng thụt lề và các dòng mới để tách các cặp khóa/giá trị. [similar to JSON]. Keys are separated from values by a colon+space. Indented blocks, common in YAML data files, use indentation and new lines to separate the key/value pairs.

Làm thế nào để bạn viết một tập tin yaml bằng python?

Viết tệp yaml trong python open config.py và thêm các dòng mã sau ngay bên dưới phương thức read_yaml và phía trên khối chính của tệp.Trong phương thức write_yaml, chúng tôi mở một tệp có tên Toyaml.YML ở chế độ ghi và sử dụng phương thức kết xuất của các gói YAML để ghi tài liệu YAML vào tệp.Open config.py and add the following lines of code just below the read_yaml method and above the main block of the file. In the write_yaml method, we open a file called toyaml. yml in write mode and use the YAML packages' dump method to write the YAML document to the file.

Các tệp yaml được viết trong là gì?

YAML có các tính năng đến từ Perl, C, XML, HTML và các ngôn ngữ lập trình khác.YAML cũng là một superset của JSON, vì vậy các tệp JSON có giá trị trong YAML.YAML sử dụng thụt theo kiểu Python để biểu thị việc làm tổ.Các ký tự tab không được phép, vì vậy thay vào đó, khoảng trắng được sử dụng.Perl, C, XML, HTML, and other programming languages. YAML is also a superset of JSON, so JSON files are valid in YAML. YAML uses Python-style indentation to indicate nesting. Tab characters are not allowed, so whitespaces are used instead.

Bài Viết Liên Quan

Chủ Đề