Python YAML đến lớp

PyYaml là một thư viện tuyệt vời. Tuy nhiên, có một chút khó khăn đối với bất kỳ ai khi thêm khả năng yaml vào các lớp của họ trong khi vẫn kiểm soát những gì đang xảy ra. Lớp trợ giúp

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
7 của nó là bước đầu tiên nhưng nó có hai nhược điểm

  • người ta phải thành thạo các tính năng bên trong của PyYaml Loader/Dumper để hiểu họ đang làm gì
  • có một siêu dữ liệu bắt buộc, có thể ngăn cản việc áp dụng rộng rãi [đa kế thừa với siêu dữ liệu. ]

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
8 cung cấp một cách rất dễ dàng để bạn tận dụng PyYaml mà không thấy sự phức tạp. chỉ cần kế thừa từ
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
9, trang trí bằng
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
0 và bạn đã sẵn sàng

Sau đó, bạn có thể tùy ý ghi đè các phương thức

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
1 và
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
2 để ghi/tải từ một từ điển, để điều chỉnh khả năng yaml cho phù hợp với nhu cầu lớp học của bạn

Ngoài ra,

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
8 cung cấp cách tạo codec Yaml cho nhiều loại đối tượng cùng một lúc [
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
4]

Khi sử dụng pyyaml ​​để nhập YAML, các giá trị là chính tả và liệt kê các đối tượng. Sử dụng đối tượng dict hoặc list sẽ gây nhầm lẫn như vậy

  • Thuộc tính không tồn tại tham chiếu cho loại phiên bản không mong muốn
  • Đánh máy chỉ mục hoặc tên khóa

Để tránh những nhầm lẫn này, một trong những cách tốt là sử dụng đối tượng làm mô hình và python có một mô-đun Data Classes tốt cho mục đích này

2. Truy cập toàn cầu và kiểm tra đơn vị dễ dàng

Bạn sẽ muốn gọi cấu hình là toàn cầu vì thật rắc rối khi chuyển giá trị cấu hình làm đối số lặp đi lặp lại giống như một lữ đoàn xô

Tuy nhiên, khi kiểm tra đơn vị, nếu tệp YAML được tải tự động khi nhập định nghĩa toàn cầu, bạn sẽ gặp phải vấn đề là bạn không thể thay thế tệp YAML cấu hình bằng tệp để kiểm tra đơn vị. Cấu hình lớp dữ liệu YAML có thể phân chia thời gian giữa phiên bản toàn cầu định nghĩa và tải tệp YAML để bạn có thể thay thế tệp YAML để kiểm tra đơn vị

Bắt đầu nhanh

1. Cài đặt

pip install yamldataclassconfig

2. Chuẩn bị file YAML cấu hình

Đặt

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
0 Lớp dữ liệu YAML Cấu hình tải
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
0 trên thư mục thực thi Python theo mặc định

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'

3. Tạo lớp cấu hình

Ở đâu cũng được, ví dụ, tôi thích đặt trên

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
2

from dataclasses import dataclass, field
from datetime import datetime
from dataclasses_json import DataClassJsonMixin
from marshmallow import fields
from yamldataclassconfig.config import YamlDataClassConfig


@dataclass
class PartConfig[DataClassJsonMixin]:
    property_c: datetime = field[metadata={'dataclasses_json': {
        'encoder': datetime.isoformat,
        'decoder': datetime.fromisoformat,
        'mm_field': fields.DateTime[format='iso']
    }}]


@dataclass
class Config[YamlDataClassConfig]:
    property_a: int = None
    property_b: str = None
    part_config: PartConfig = field[
        default=None,
        metadata={'dataclasses_json': {'mm_field': PartConfig}}
    ]

4. Xác định là toàn cầu

Ngoài ra, ở đâu cũng được, ví dụ, tôi thích đặt trên

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
3

from myproduct.config import Config

CONFIG: Config = Config[]

5. Tải cuộc gọi trước giá trị cấu hình tham chiếu

________số 8

Làm thế nào để tôi

Sửa đường dẫn đến tệp yaml độc lập trên thư mục thực thi Python?

ghi đè thuộc tính

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
4

Bán tại

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
0

Chuyển tệp cấu hình YAML đích sang tệp để thử nghiệm đơn vị?

Khi thiết lập thử nghiệm đơn vị, bạn có thể gọi

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
5 với đối số

Trường hợp khi unittest

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
2

Trường hợp khi pytest

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
3

Sử dụng đường dẫn đến tệp cấu hình YAML giống như sản xuất khi kiểm tra?

fixturefilehandler có thể thay thế cấu hình. yml với các bài kiểm tra/cấu hình. yml. xa một cách dễ dàng. Vui lòng gọi tất cả

property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
6 với đối số phiên bản
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
7 để tạo ConfigDeployer. Sau đó, đặt thư mục đích mà cấu hình. yml nên được đặt vào
property_a: 1
property_b: '2'
part_config:
  property_c: '2019-06-25 13:33:30'
8

Sự khác biệt giữa Python YAML và PyYAML là gì?

YAML là định dạng tuần tự hóa dữ liệu được thiết kế để con người có thể đọc được và tương tác với các ngôn ngữ kịch bản. PyYAML là trình phân tích cú pháp YAML và trình phát cho Python . PyYAML có YAML 1 hoàn chỉnh. 1, hỗ trợ Unicode, hỗ trợ dưa chua, API mở rộng có khả năng và thông báo lỗi hợp lý.

Trình phân tích cú pháp Python YAML tốt nhất là gì?

Trình phân tích cú pháp YAML của python được sử dụng nhiều nhất là PyYAML , một thư viện cho phép bạn tải, phân tích cú pháp và viết YAML, giống như JSON của Python .

YAML có được tích hợp vào Python không?

Tuy nhiên, Python thiếu hỗ trợ tích hợp sẵn 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ó sự tương đồng rõ ràng giữa hai định dạng này .

Làm cách nào để nhập mô-đun YAML bằng Python?

Câu trả lời của bạn .
Bạn có thể thử tính năng tìm kiếm trong pip. $ pip tìm kiếm yaml. .
Bây giờ bạn đã biết một tên gói cụ thể, bạn có thể cài đặt nó. $ pip cài đặt pyyaml

Chủ Đề