marshal --- سریالسازی داخلی اشیای پایتون¶
این ماژول شامل توابعی است که میتوانند مقادیر پایتون را در یک قالب دودویی بخوانند و بنویسند. این قالب مختص پایتون است، اما از مسائل معماری ماشین مستقل است (برای مثال، میتوانید یک مقدار پایتون را در پروندهای روی یک رایانه شخصی بنویسید، پرونده را به یک مک منتقل کنید و آن را در آنجا بازخوانی کنید). جزئیات این قالب عمداً مستند نشده است؛ ممکن است بین نسخههای پایتون تغییر کند (اگرچه بهندرت این اتفاق میافتد). [1]
این یک ماژول عمومی برای «ماندگاری» نیست. برای ماندگاری عمومی و انتقال اشیای پایتون از طریق فراخوانیهای RPC، ماژولهای pickle و shelve را ببینید. ماژول marshal عمدتاً برای پشتیبانی از خواندن و نوشتن کد «شبهکامپایلشده» برای ماژولهای پایتون در پروندههای .pyc وجود دارد. بنابراین، نگهدارندگان پایتون این حق را برای خود محفوظ میدارند که در صورت نیاز، قالب marshal را بهصورت ناسازگار با نسخههای قبلی تغییر دهند. قالب اشیای کد بین نسخههای پایتون سازگار نیست، حتی اگر نسخهی قالب یکسان باشد. سریالزدایی یک شیء کد در نسخهی نادرست پایتون، رفتار تعریفنشده دارد. اگر اشیای پایتون را سریالسازی و سریالزدایی میکنید، بهجای آن از ماژول pickle استفاده کنید — عملکرد آن قابلمقایسه است، استقلال از نسخه تضمین میشود، و pickle از طیف بسیار گستردهتری از اشیاء نسبت به marshal پشتیبانی میکند.
هشدار
ماژول marshal برای ایمن بودن در برابر دادههای نادرست یا بدخواهانه ساختهشده طراحی نشده است. هرگز دادههای دریافتشده از منبع نامعتبر یا احراز هویتنشده را unmarshal نکنید.
توابعی وجود دارند که پروندهها را میخوانند/مینویسند، و همچنین توابعی که روی اشیاء شبهبایت (bytes-like) عمل میکنند.
از همه انواع شیء پایتون پشتیبانی نمیشود؛ بهطور کلی، فقط اشیایی که مقدارشان مستقل از اجرای خاصی از پایتون باشد را میتوان با این ماژول نوشت و خواند. از انواع زیر پشتیبانی میشود:
رشتهها (
str) وbytes. اشیاء شبهبایت مانندbytearrayبهصورتbytesمارشال (marshalled) میشوند.ظرفها:
tuple،list،set،frozensetوslice(ازversion5). باید توجه داشته باشید که این موارد تنها در صورتی پشتیبانی میشوند که مقادیر درون آنها نیز پشتیبانی شوند. ظرفهای بازگشتی ازversion3 پشتیبانی میشوند.مقادیر تکنمونه
None،EllipsisوStopIteration.اشیای
code، اگر allow_code درست باشد. یادداشت بالا درباره وابستگی به نسخه را ببینید.
تغییر یافته در نسخهی 3.4:
نسخه 3 قالب افزوده شد که از مارشالکردن فهرستها، مجموعهها و دیکشنریهای بازگشتی پشتیبانی میکند.
نسخهی 4 قالب افزوده شد، که از بازنماییهای کارآمد رشتههای کوتاه پشتیبانی میکند.
تغییر یافته در نسخهی 3.14: نسخهی 5 قالب افزوده شد که امکان مارشالکردن اسلایسها را فراهم میکند.
این ماژول توابع زیر را تعریف میکند:
- marshal.dump(value, file, version=version, /, *, allow_code=True)¶
مقدار را در پرونده باز بنویسید. مقدار باید از یک نوع پشتیبانیشده باشد. پرونده باید یک binary file قابلنوشتن باشد.
اگر مقدار دارای نوعی پشتیبانینشده باشد (یا شامل شیءای باشد که چنین نوعی دارد)، استثنای
ValueErrorپرتاب میشود --- اما دادههای نامعتبر نیز در پرونده نوشته خواهند شد. شیء بهدرستی توسطload()بازخوانی نخواهد شد. اشیاء کد فقط در صورتی پشتیبانی میشوند که allow_code برابر true باشد.آرگومان version قالب دادهای را مشخص میکند که
dumpباید از آن استفاده کند (در زیر ببینید).یک رویداد حسابرسی
marshal.dumpsرا با آرگومانهایvalueوversionپرتاب میکند.تغییر یافته در نسخهی 3.13: پارامتر allow_code اضافه شد.
- marshal.load(file, /, *, allow_code=True)¶
یک مقدار را از پرونده باز میخواند و آن را برمیگرداند. اگر هیچ مقدار معتبری خوانده نشود (مثلاً به این دلیل که دادهها قالب marshal ناسازگارِ نسخهای متفاوت از پایتون دارند)،
EOFError،ValueErrorیاTypeErrorرا پرتاب میکند. از اشیای کد فقط در صورتی پشتیبانی میشود که allow_code مقدار true باشد. پرونده باید یک پرونده دودویی قابلخواندن باشد.یک رویداد حسابرسی
marshal.loadرا بدون آرگومان پرتاب میکند.توجه
اگر شیءای که حاوی یک نوع پشتیبانینشده است با
dump()مارشالشده باشد،load()نوع غیرقابلمارشال را باNoneجایگزین میکند.تغییر یافته در نسخهی 3.10: این فراخوانی پیشتر برای هر شیء کد یک رویداد حسابرسی (audit event)
code.__new__را پرتاب میکرد. اکنون یک رویداد واحدmarshal.loadرا برای کل عملیات بارگذاری پرتاب میکند.تغییر یافته در نسخهی 3.13: پارامتر allow_code اضافه شد.
- marshal.dumps(value, version=version, /, *, allow_code=True)¶
شیء bytes را برمیگرداند که توسط
dump(value, file)در یک پرونده نوشته میشد. مقدار باید از یک نوع پشتیبانیشده باشد. اگر مقدار از یک نوع پشتیبانینشده باشد (یا شامل شیءای باشد که از یک نوع پشتیبانینشده باشد)، استثنایValueErrorرا پرتاب میکند. اشیاء کد فقط در صورتی پشتیبانی میشوند که allow_code درست باشد.آرگومان version قالب دادهای را مشخص میکند که
dumpsباید از آن استفاده کند (در زیر ببینید).یک رویداد حسابرسی
marshal.dumpsرا با آرگومانهایvalueوversionپرتاب میکند.تغییر یافته در نسخهی 3.13: پارامتر allow_code اضافه شد.
- marshal.loads(bytes, /, *, allow_code=True)¶
bytes-like object را به یک مقدار تبدیل میکند. اگر هیچ مقدار معتبری یافت نشود،
EOFError،ValueErrorیاTypeErrorپرتاب میشود. اشیاء کد فقط در صورتی پشتیبانی میشوند که allow_code درست باشد. بایتهای اضافی در ورودی نادیده گرفته میشوند.یک رویداد حسابرسی
marshal.loadsرا با آرگومانbytesپرتاب میکند.تغییر یافته در نسخهی 3.10: این فراخوانی پیشتر برای هر شیء کد، یک رویداد حسابرسی
code.__new__پرتاب میکرد. اکنون یک رویدادmarshal.loadsرا برای کل عملیات بارگذاری پرتاب میکند.تغییر یافته در نسخهی 3.13: پارامتر allow_code اضافه شد.
علاوه بر این، ثابتهای زیر تعریف شدهاند:
- marshal.version¶
قالب مورد استفادهی ماژول را نشان میدهد. نسخهی 0 نخستین نسخه از نظر تاریخی است؛ نسخههای بعدی قابلیتهای جدیدی اضافه میکنند. بهطور معمول، یک نسخهی جدید هنگام معرفی به پیشفرض تبدیل میشود.
نسخه
در دسترس از
قابلیتهای جدید
1
Python 2.4
اشتراکگذاری رشتههای درونیسازیشده (interned strings)
۲
Python 2.5
نمایش دودویی اعداد اعشاری
3
Python 3.4
پشتیبانی از نمونهسازی شیء و بازگشت
۴
Python 3.4
بازنمایی کارآمد رشتههای کوتاه
۵
Python 3.14
پشتیبانی از اشیاء
slice
پانویسها