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 đó:
<?xml version="1.0" encoding="UTF-8" ?><personfirstName="John"lastName="Doe"><dateOfBirth>1969-12-31</dateOfBirth><married>true</married><spouse><personfirstName="Jane"lastName="Doe"><dateOfBirth/><!- This is a comment --></person></spouse></person>
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
XML
Json
Yaml
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:
Đồ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:
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 (
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 (
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ụ,
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ụ,
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 (
Đươ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:
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 (
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 (
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:
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.
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à
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
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:
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:
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 (
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 (
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
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:
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:
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:
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:
>>>
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
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.
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:
>>>
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
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.
>>>
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
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.
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
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
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,
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ải
Nếu bạn muốn hiệu suất phân tích cú pháp tốt nhất có thể, thì bạn sẽ cần nhập thủ công lớp Trình tải phù hợp và chuyển nó đến hàm
93 chung. 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ư
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
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,
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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,
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
99 vì chúng là bộ tải duy nhất có thể xử lý các thẻ cụ thể của Python:
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
9
Thẻ
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
Cả hai kiểu đều đạt được hiệu ứng tương tự bằng cách gọi phương thức
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
44 trong lớp
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
51 hoặc
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
51 or
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
52 module to run a shell command that retrieves your private SSH key if you’ve defined one:
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:
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
53 trong một tệp nguồn riêng biệt có tên
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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ẻ
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
37 trong YAML, thì thư viện gọi
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
43 mà không có bất kỳ đối số nào và không bao giờ gọi
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
44. Thay vào đó, nó trực tiếp điều khiển thuộc tính
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
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:
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
53 trong một tệp nguồn riêng biệt có tên
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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ẻ
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
37 trong YAML, thì thư viện gọi
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
43 mà không có bất kỳ đối số nào và không bao giờ gọi
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
44. Thay vào đó, nó trực tiếp điều khiển thuộc tính
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
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:
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
72
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
73
Bạn đặt lớp
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
53 trong một tệp nguồn riêng biệt có tên
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
53 mới, nhưng nó đã được khởi tạo đúng, bởi vì thuộc tính
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
60 bị thiếu. Tuy nhiên, nó có một
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
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:
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,
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
76 và
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
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:
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:
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
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à
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
85 giàu tính năng nhất. Các lựa chọn khác như sau:
Lớp học
Hàm số
Sự mô tả
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
86
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
87
Không hỗ trợ bất kỳ thẻ nào và chỉ hữu ích cho phân lớp
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
91
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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ừ
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
91 và
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
88 vì
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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:
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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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ó:
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ề
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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,
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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.
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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName: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
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
Đố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 đó:
Để 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:
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:
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
%YAML1.2---person:dateOfBirth:1969-12-31firstName:JohnlastName:Doemarried:truespouse:dateOfBirth:null# This is a commentfirstName:JanelastName:Doe
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ấp
Cá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:
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:
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
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
Các dòng 10 đến 13 Kiểm tra loại mã thông báo hiện tại và mang lại các chỉ số và một phiên bản mã thông báo. Nếu mã thông báo là một thẻ, thì nó sẽ được mang lại. Nếu mã thông báo là vô hướng, thì
81 được mang lại vì vô hướng có thể xuất hiện trong các bối cảnh khác nhau và bạn cần biết bối cảnh hiện tại là gì để chọn màu thích 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
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:
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
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
Các dòng 10 đến 13 Kiểm tra loại mã thông báo hiện tại và mang lại các chỉ số và một phiên bản mã thông báo. Nếu mã thông báo là một thẻ, thì nó sẽ được mang lại. Nếu mã thông báo là vô hướng, thì
81 được mang lại vì vô hướng có thể xuất hiện trong các bối cảnh khác nhau và bạn cần biết bối cảnh hiện tại là gì để chọn màu thích hợp.
Các dòng 14 và 15 cập nhật bối cảnh nếu mã thông báo hiện tại là khóa ánh xạ hoặc giá trị. Các loại mã thông báo khác bị bỏ qua, vì chúng không có một biểu diễn trực quan có ý nghĩa.
Khi bạn nhập chức năng của mình vào phiên phiên dịch Python tương tác, thì bạn sẽ có thể bắt đầu lặp lại trên tập hợp con của mã thông báo với các chỉ số có liên quan của chúng:
Gọn gàng! Bạn có thể tận dụng các bộ dữ liệu này để chú thích các mã thông báo trong văn bản gốc bằng thư viện bên thứ ba hoặc chuỗi thoát ANSI miễn là thiết bị đầu cuối của bạn hỗ trợ chúng. Dưới đây là một vài màu mẫu với trình tự thoát của chúng:
Màu sắc
Khi bạn nhập chức năng của mình vào phiên phiên dịch Python tương tác, thì bạn sẽ có thể bắt đầu lặp lại trên tập hợp con của mã thông báo với các chỉ số có liên quan của chúng:
Gọn gàng! Bạn có thể tận dụng các bộ dữ liệu này để chú thích các mã thông báo trong văn bản gốc bằng thư viện bên thứ ba hoặc chuỗi thoát ANSI miễn là thiết bị đầu cuối của bạn hỗ trợ chúng. Dưới đây là một vài màu mẫu với trình tự thoát của chúng:
Mộ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:
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:
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.
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
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:
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ẻ
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.
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
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
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
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.
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,
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:
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 (
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 đủ:
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
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.
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
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.
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.
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ư
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:
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.
Yaml có dựa trên Python không?
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ữ. ... các tính năng độc đáo ..
Làm thế nào để bạn viết yaml trong 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.
Yaml có giống như Python không?
Python được khen ngợi nhiều nhất vì cú pháp thanh lịch và mã có thể đọc được, nếu bạn mới bắt đầu sự nghiệp lập trình Python phù hợp với bạn nhất.Mặt khác, YAML được trình bày chi tiết là "một định dạng tuần tự dữ liệu có thể phân tích đơn giản được thiết kế cho khả năng đọc và tương tác của con người".YAML is detailed as "A straightforward machine parsable data serialization format designed for human readability and interaction".