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

การทำให้เป็นอันดับวัตถุ Python ภายใน (จอมพล)


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

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

ดัมพ์() − ส่งคืนไบต์เหมือนวัตถุที่จัดเรียงวัตถุ Python ของฉัน รองรับเฉพาะออบเจ็กต์ประเภทข้อมูลมาตรฐานสำหรับการจัดวาง ประเภทที่ไม่รองรับทำให้เกิดข้อยกเว้น ValueError

โหลด() − ฟังก์ชันนี้แปลงไบต์เช่นอ็อบเจ็กต์เป็นอ็อบเจกต์ Python ที่สอดคล้องกัน หากการแปลงไม่ส่งผลให้วัตถุ Python ถูกต้อง อาจมีการเพิ่ม ValueError หรือ TypeError

โค้ดต่อไปนี้แสดงอ็อบเจกต์พจนานุกรม Python ที่จัดการโดยใช้ dumps() การแสดงไบต์จะถูกแปลงกลับเป็นพจนานุกรมโดยฟังก์ชัน loads()

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

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

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

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

รหัสใช้ฟังก์ชันคอมไพล์ในตัว () เพื่อสร้างวัตถุโค้ดจากสตริงต้นทางที่ฝังคำสั่ง Python

compile(source, file, 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()

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

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

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

addition = 30