Làm cách nào để giải tuần tự hóa từ điển trong Python?

Dictionary deserializer là một dự án được xây dựng để chuyển đổi từ điển thành các lớp tổng hợp theo cách trực quan. Đặc biệt chú ý đến việc thân thiện với trình kiểm tra kiểu tĩnh và tự động hoàn thành IDE

Dự kiến ​​thư viện này được sử dụng cùng với trình giải tuần tự JSON-to-dict như

pip install dictionary-deserializer
pip freeze > requirements.txt
2

Cài đặt

Để sử dụng nó, chỉ cần thêm phần phụ thuộc

pip install dictionary-deserializer
pip freeze > requirements.txt
3 vào tệp yêu cầu của bạn

đường ống

pipenv install dictionary-deserializer

Pip

pip install dictionary-deserializer
pip freeze > requirements.txt

Thiết kế

Dự án này ban đầu được coi là một bằng chứng về khái niệm, được sử dụng để tìm các dự án khác có thể thay thế dự án này, với bộ tính năng cần thiết. Dự án đó không được tìm thấy, và do đó, dự án này đã được mở rộng

Yêu cầu

  • Sử dụng gợi ý loại để xác thực loại
  • Cho phép đa hình
    • Qua
      pip install dictionary-deserializer
      pip freeze > requirements.txt
      
      4s
    • Thông qua phân lớp
  • Hỗ trợ một phần lớn các loại mô-đun
    pip install dictionary-deserializer
    pip freeze > requirements.txt
    
    5
  • Cho phép xác thực trên các giá trị
  • Có thể xác thực và giải tuần tự hóa bất kỳ cấu trúc JSON tuân thủ nào
  • Tương thích với trình kiểm tra kiểu tĩnh và gợi ý IDE
  • Có tác động nhỏ đến mã hiện có khi bắt đầu sử dụng thư viện này

ví dụ

Không mã nào trong số này thực sự hữu ích nếu bạn không hiểu cách sử dụng nó. Nó rất đơn giản. Dưới đây là một số ví dụ

Chỉ định một cấu trúc

from typing import Optional

from dict_deserializer.deserializer import Deserializable

class User[Deserializable]:
    email: str                  # Type must be a string
    username: str               # Type must be a string
    password: Optional[str]     # Type must either be a string or a None

khử lưu huỳnh

from dict_deserializer.deserializer import deserialize, Rule

# Successful
deserialize[Rule[User], {
    'email': 'pypi@rolfvankleef.nl',
    'username': 'rkleef',
}]

# Fails because optional type is wrong
deserialize[Rule[User], {
    'email': 'pypi@rolfvankleef.nl',
    'username': 'rkleef',
    'password': 9.78,
}]

cấu trúc đa hình

from typing import Optional, Any, List

from dict_deserializer.deserializer import Deserializable
from dict_deserializer.annotations import abstract

@abstract
class DirectoryObject[Deserializable]:
    name: str
    meta: Any

class User[DirectoryObject]:
    full_name: str
    first_name: Optional[str]

class Group[DirectoryObject]:
    members: List[DirectoryObject]

Nếu bạn deserialize thành

pip install dictionary-deserializer
pip freeze > requirements.txt
0, lớp phù hợp sẽ tự động được chọn. Nếu không có lớp con nào phù hợp, sẽ xảy ra lỗi do DirectoryObject được khai báo là trừu tượng

Nếu bạn muốn phân biệt không phải theo tên hoặc loại trường mà theo giá trị của chúng, người ta có thể chọn xác định chú thích

pip install dictionary-deserializer
pip freeze > requirements.txt
1

Xác thực giá trị

Cú pháp xác thực giá trị của khóa hiện tại hơi lạ. Nó không tương thích với cú pháp hiện có cho các giá trị mặc định, nhưng cú pháp kiểu thì giống nhau

Thí dụ

from typing import Optional

from dict_deserializer.deserializer import Deserializable
from dict_deserializer.annotations import validated

class Test[Deserializable]:
    name: Optional[str]

    @validated[default='Unknown']
    def name[self, value]:
        if len[value] > 20:
            raise TypeError['Name may not be longer than 20 characters.']

Hạn chế

Thư viện này sử dụng rộng rãi mô-đun

pip install dictionary-deserializer
pip freeze > requirements.txt
5. Tuy nhiên, nó chỉ hỗ trợ một số loại của nó. Đây là danh sách các loại hỗn hợp đã được xác minh

Chúng tôi sẽ xem xét các hạn chế của chúng, lỗi thời gian chạy, v.v. , với mã mẫu. Chúng tôi bắt đầu từ một loại từ điển cơ bản và cuối cùng thảo luận về một giải pháp để làm việc với các đối tượng Python phức tạp

Từ điển

Python và mô-đun json đang hoạt động rất tốt với từ điển. Phần sau đây dành cho tuần tự hóa và giải tuần tự hóa Python…

Đây là bài viết tiếp theo về Cách tuần tự hóa một đối tượng lớp thành JSON trong Python để đóng vòng lặp về các vấn đề tuần tự hóa và giải tuần tự hóa trong Python. Tuần tự hóa đang biến một đối tượng thành các chuỗi hoặc tệp và để lấy lại các đối tượng ban đầu từ các chuỗi đã lưu là giải tuần tự hóa. Nếu bạn hiểu cách tuần tự hóa được thực hiện, bạn có thể đảo ngược quá trình giải tuần tự hóa khá nhiều. Tuy nhiên, như thường lệ, ma quỷ nằm trong chi tiết. Trước tiên hãy bắt đầu với định nghĩa của một lớp tùy chỉnh

1. Định nghĩa lớp tùy chỉnh

Để khớp hình minh họa với bài viết trước, trước tiên hãy sử dụng cùng một lớp Nhãn đơn giản

________số 8

Chuỗi được tuần tự hóa bằng cách sử dụng json. bãi [] là

{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
2. json. tải [] với object_hook

Phương thức deserialization mặc định là json. loading[] lấy một chuỗi làm đầu vào và xuất ra một đối tượng từ điển JSON. Để chuyển đổi đối tượng từ điển thành đối tượng lớp tùy chỉnh, bạn cần viết phương thức giải tuần tự hóa. Cách dễ nhất là thêm một phương thức tĩnh vào chính lớp đó. Toàn bộ lớp với các phương thức serialize [to_json] và deserialize [from_json] sẽ trông như thế này

Được trang bị phương pháp khử lưu huỳnh, chúng ta có thể gọi json. loading và chỉ định phương thức deserialization mới của lớp Label là object_hook

Phương thức loading[], thay vì trả về một đối tượng từ điển JSON, sẽ trả về một đối tượng Nhãn thích hợp như mong đợi

3. đối tượng lồng nhau

Càng xa càng tốt. Bây giờ hãy xem bạn cần làm gì đối với các trường hợp phức tạp hơn khi bạn có các đối tượng lồng nhau. Lớp ImageLabelCollection chứa danh sách các đối tượng Nhãn như một phần của biến lớp 'bboxes'. Định nghĩa của lớp được sao chép bên dưới với phương thức tuần tự hóa to_json[]

Một mẫu của chuỗi json kết quả là

Đối tượng ImageLabelCollection được tuần tự hóa

Để giải tuần tự hóa chuỗi thành một đối tượng lớp, bạn cần viết một phương thức tùy chỉnh để xây dựng đối tượng. Bạn có thể thêm một phương thức tĩnh vào ImageLabelCollection bên trong đó bạn xây dựng các đối tượng Nhãn từ từ điển JSON đã tải và sau đó gán chúng dưới dạng danh sách cho biến lớp bbox

Quá trình này hơi tẻ nhạt nhưng có một cách tốt hơn. Bạn có thể viết phương thức tĩnh from_json[] trong đó bạn xử lý việc xây dựng đối tượng lớp tăng dần

Khi json. loading[] được gọi với phương thức from_json[] ở trên làm hook đối tượng, nó sẽ gọi phương thức này lặp đi lặp lại khi nó xây dựng đối tượng từ dưới lên

Điều hấp dẫn là phương thức này được gọi nhiều lần và mỗi lần, một phần khác của đối tượng từ điển được gọi, do đó bạn phải thêm logic xử lý cách biến các đối tượng từ điển thành các đối tượng lớp phù hợp tùy thuộc vào loại. Trong trường hợp trên, tôi đã sử dụng sự hiện diện của một số khóa nhất định làm gợi ý để quyết định hàm tạo nào sẽ được gọi. Vẫn còn một chút tẻ nhạt, nhưng tốt hơn giải pháp ban đầu là tự viết toàn bộ mã

4. jsonpickle

Phương pháp giải tuần tự hóa cuối cùng là sử dụng một thư viện bên ngoài có tên là jsonpickle. Bạn có thể dễ dàng cài đặt nó bằng cách

pip install dictionary-deserializer
pip freeze > requirements.txt
0

Cách sử dụng khá đơn giản. Bạn gọi jsonpickle. encode[] để tuần tự hóa và giải mã[] để giải tuần tự hóa

Kết quả tuần tự hóa hơi khác so với chuỗi JSON ban đầu của chúng tôi

pip install dictionary-deserializer
pip freeze > requirements.txt
1

Nó đã thêm một số thông tin chú thích bổ sung để giải tuần tự hóa sau

Phần kết luận

Với tính đơn giản của jsonpickle, có vẻ như đối với các mục đích chung, đây sẽ là phương pháp dễ dàng nhất để tuần tự hóa. Tuy nhiên, hạn chế là do thuộc tính bổ sung của jsonpickle trong chuỗi JSON, bạn cần sử dụng phương thức giải mã [] của jsonpickle để đưa các đối tượng trở lại. Nói chung, đây không phải là vấn đề, nhưng nếu bạn có một số đối tượng tùy chỉnh mà bạn cần tự xử lý, bạn có thể sử dụng phương pháp khử lưu huỳnh tùy chỉnh được đề xuất. Toàn bộ code mẫu được chia sẻ tại đây. Cảm ơn vì đã đọc

Làm cách nào để tuần tự hóa một lệnh trong Python?

Để tuần tự hóa một từ điển đã cho d , chỉ cần nhập mô-đun pickle bằng import pickle và gán kết quả của pickle. kết xuất [d] thành một biến . Sau đó, biến này sẽ giữ một chuỗi nhị phân được đánh số thứ tự mà bạn có thể sử dụng để lưu trữ từ điển trên máy tính của mình hoặc gửi nó qua mạng.

Làm cách nào để giải tuần tự hóa lớp trong Python?

Để giải tuần tự hóa chuỗi thành một đối tượng lớp, bạn cần phải viết một phương thức tùy chỉnh để xây dựng đối tượng . Bạn có thể thêm một phương thức tĩnh vào ImageLabelCollection bên trong đó bạn xây dựng các đối tượng Nhãn từ từ điển JSON đã tải và sau đó gán chúng dưới dạng danh sách cho biến lớp bbox.

Làm cách nào để xuất từ ​​điển bằng Python?

Bạn có thể lưu từ điển của mình vào tệp văn bản bằng mã bên dưới. .
# xác định chính tả
dict = {'Trăn'. '. py', 'C++'. '. cpp', 'Java'. '. java'}
# mở tập tin để viết
# ghi tập tin
# Đóng tập tin

Làm cách nào để tuần tự hóa và giải tuần tự hóa JSON trong Python?

Để tuần tự hóa và giải tuần tự hóa các đối tượng JSON Có thể sử dụng Python “__dict__” . Có __dict__ trên bất kỳ đối tượng Python nào, là từ điển được sử dụng để lưu trữ các thuộc tính [có thể ghi] của đối tượng. Chúng tôi có thể sử dụng nó để làm việc với JSON và nó hoạt động tốt.

Chủ Đề