Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การทำให้เป็นอนุกรมอ็อบเจ็กต์ภายใน Python (marshal)

แม้ว่าโมดูล marshal ในไลบรารีมาตรฐานของ Python จะให้คุณสมบัติการ serialize อ็อบเจ็กต์ (คล้ายกับโมดูล pickle) แต่จริงๆ แล้วมันไม่ได้มีประโยชน์สำหรับการทำให้ข้อมูลคงอยู่ (data persistence) ทั่วไป หรือการส่งอ็อบเจ็กต์ Python ผ่านโซเก็ต ฯลฯ โมดูลนี้ใช้ส่วนใหญ่โดย Python เอง เพื่อรองรับการอ่าน/เขียนของเวอร์ชันที่คอมไพล์แล้วของโมดูล Python (.pyc files) รูปแบบข้อมูลที่ใช้โดยโมดูล marshal ไม่เข้ากันได้ข้ามเวอร์ชัน Python (แม้แต่ subversions) นั่นคือเหตุผลที่สคริปต์ Python ที่คอมไพล์แล้ว (.pyc file) ของเวอร์ชันหนึ่งมักจะไม่รันบนอีกเวอร์ชันหนึ่ง โมดูล marshal จึงถูกใช้สำหรับ serialization อ็อบเจ็กต์ภายในของ Python

เหมือนกับโมดูล pickle โมดูล marshal ก็กำหนดฟังก์ชัน load() และ dump() สำหรับอ่านและเขียนอ็อบเจ็กต์ที่ marshaled จาก/ไปยังไฟล์ นอกจากนี้ loads() และ dumps() จัดการกับการแสดงสตริงของอ็อบเจ็กต์ที่ marshaled

dumps() - คืนค่าอ็อบเจ็กต์คล้ายไบต์โดยการ marshal อ็อบเจ็กต์ Python รองรับเฉพาะอ็อบเจ็กต์ของชนิดข้อมูลมาตรฐาน ชนิดที่ไม่รองรับจะยก ValueError exception

loads() - ฟังก์ชันนี้แปลงอ็อบเจ็กต์คล้ายไบต์เป็นอ็อบเจ็กต์ Python ที่สอดคล้องกัน หากการแปลงไม่ได้ผลเป็นอ็อบเจ็กต์ Python ที่ถูกต้อง อาจยก ValueError หรือ TypeError

โค้ดต่อไปนี้แสดงอ็อบเจ็กต์ดิกชันนารี Python ถูก marshal ด้วย dumps() การแสดงไบต์ถูกแปลงกลับเป็นดิกชันนารีโดยฟังก์ชัน loads():

import marshal

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

dump() - ฟังก์ชันนี้เขียนการแสดงไบต์ของอ็อบเจ็กต์ Python ที่รองรับไปยังไฟล์ ไฟล์ต้องเป็นไฟล์ไบนารีที่มีสิทธิ์เขียน

load() - ฟังก์ชันนี้อ่านข้อมูลไบต์จากไฟล์ไบนารีและแปลงเป็นอ็อบเจ็กต์ Python

ตามที่กล่าวไว้ข้างต้น โมดูล marshal ถูกใช้เพื่อประมวลผลไฟล์ .pyc ตัวอย่างต่อไปนี้สาธิตการใช้ dump() และ load() เพื่อจัดการอ็อบเจ็กต์โค้ดของ Python ซึ่งใช้เก็บโมดูล Python ที่คอมไพล์ไว้ล่วงหน้า

โค้ดใช้ฟังก์ชันสำเร็จรูป compile() เพื่อสร้างอ็อบเจ็กต์โค้ดจากสตริงต้นทางที่ฝังคำสั่ง Python:

compile(source, file, mode)

พารามิเตอร์ file ควรเป็นไฟล์ที่โค้ดอ่านมา หากไม่ได้อ่านจากไฟล์ ส่งสตริง tùy ý ใดๆ

พารามิเตอร์ mode คือ 'exec' หากต้นทางมีลำดับคำสั่ง 'eval' หากมีนิพจน์เดี่ยว หรือ 'single' หากมีคำสั่งโต้ตอบเดี่ยว

อ็อบเจ็กต์โค้ดที่คอมไพล์แล้วจะถูกเก็บในไฟล์ .pyc โดยใช้ฟังก์ชัน 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()

เพื่อ deserialize อ็อบเจ็กต์จากไฟล์ .pyc ใช้ฟังก์ชัน load() เนื่องจากมันคืนค่าอ็อบเจ็กต์โค้ด จึงสามารถรันได้โดยใช้ exec() อีกฟังก์ชันสำเร็จรูปหนึ่ง:

import marshal

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

เอาต์พุทจะเป็นผลลัพธ์ของบล็อกโค้ดที่ฝังในสตริงต้นทาง:

addition = 30