Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tuần tự hóa đối tượng nội bộ Python (marshal)


Mặc dù mô-đun marshal trong thư viện chuẩn Python cung cấp tính năng tuần tự hóa đối tượng (tương tự mô-đun pickle), nó thực sự không hữu ích cho việc lưu trữ dữ liệu chung hoặc truyền đối tượng Python qua socket, v.v. Mô-đun này chủ yếu được dùng bởi chính Python để hỗ trợ các thao tác đọc/ghi trên các phiên bản đã biên dịch của các mô-đun Python (file .pyc). Định dạng dữ liệu dùng bởi mô-đun marshal không tương thích giữa các phiên bản Python (không kể cả các phiên bản con). Đó là lý do tại sao script Python đã biên dịch (file .pyc) của một phiên bản hầu như chắc chắn sẽ không chạy trên phiên bản khác. Mô-đun marshal do đó được dùng cho tuần tự hóa đối tượng nội bộ của Python.

Giống như mô-đun pickle, mô-đun marshal cũng định nghĩa hàm load() và dump() để đọc và ghi đối tượng marshaled từ/đến file. Ngoài ra, hàm loads() và dumps() xử lý biểu diễn chuỗi của đối tượng marshaled.

dumps() - trả về đối tượng giống byte bằng cách marshalling một đối tượng Python. Chỉ đối tượng của các kiểu dữ liệu chuẩn được hỗ trợ cho marshalling. Các kiểu không hỗ trợ ném ra ngoại lệ ValueError.

loads() - Hàm này chuyển đổi đối tượng giống byte thành đối tượng Python tương ứng. Nếu chuyển đổi không dẫn đến đối tượng Python hợp lệ, ValueError hoặc TypeError có thể được ném ra.

Đoạn mã sau cho thấy một đối tượng từ điển Python được marshalled bằng dumps(). Biểu diễn byte được chuyển đổi ngược lại thành từ điển bằng hàm loads().

import marshal
person = {"name": "xyz", "age": 22, "marks": [45, 56, 78]}
data = marshal.dumps(person)
obj = marshal.loads(data)
print(obj)

dump() - Hàm này ghi biểu diễn byte của đối tượng Python được hỗ trợ vào file. File bản thân phải là file nhị phân với quyền ghi.

load() - Hàm này đọc dữ liệu byte từ file nhị phân và chuyển đổi nó thành đối tượng Python.

Như đã nhắc ở trên, mô-đun marshal được dùng để xử lý file .pyc. Ví dụ sau minh họa việc dùng hàm dump() và load() để xử lý đối tượng code của Python, được dùng để lưu trữ mô-đun Python đã biên dịch trước.

Mã sử dụng hàm tích hợp sẵn compile() để xây dựng đối tượng code từ chuỗi nguồn nhúng các lệnh Python.

compile(source, file, mode)

Tham số file nên là file từ đó mã được đọc. Nếu nó không được đọc từ file, hãy truyền bất kỳ chuỗi tùy ý nào.

Tham số mode là 'exec' nếu nguồn chứa chuỗi câu lệnh, 'eval' nếu có một biểu thức đơn lẻ hoặc 'single' nếu nó chứa một câu lệnh tương tác đơn lẻ.

Đối tượng code được biên dịch sau đó được lưu trong file .pyc bằng hàm dump():

import marshal
script = """
a = 10
b = 20
print('addition = ', a+b)
"""
code = compile(script, "script", "exec")
f = open("a.pyc", "wb")
marshal.dump(code, f)
f.close()

Để giải tuần tự hóa đối tượng từ file .pyc, dùng hàm load(). Vì nó trả về đối tượng code, nó có thể được chạy bằng exec(), một hàm tích hợp sẵn khác.

import marshal
f = open("a.pyc", "rb")
data = marshal.load(f)
exec(data)

Đầu ra sẽ là kết quả của khối code nhúng trong chuỗi nguồn:

addition = 30