تقنية

zlib في بايثون: هل يسمح flush الافتراضي بمواصلة الضغط؟

التفريغ الافتراضي ينهي الضغط والمحاولة التالية ترفع خطأ
نهاية الضغط. [1] [2]

التفريغ قد ينهي كائن الضغط. [1] [2]

الخلاصة السريعة

flush() الافتراضي يستعمل Z_FINISH؛ لا يسمح بضغط لاحق. [1] [2]

  • ضغطنا bud ثم نفذنا a.flush(). [1] [2]
  • محاولة ضغط leaf بعدها ترفع zlib.error. [1] [2]
  • Z_SYNC_FLUSH يسمح بالمتابعة في الكائن الثاني. [1] [2]
  • جمعنا كل المخرج وأنهيناه؛ الفك يعيد b'budleaf'. [1] [2]
  • نفحص 3.12.14 وzlib 1.3.2 دون ملفات. [1] [2]

المثال

import zlib as z
a=z.compressobj()
a.compress(b"bud")
a.flush()
try:
    a.compress(b"leaf")
except z.error:
    print("error")
b=z.compressobj()
c=b.compress(b"bud")
c+=b.flush(z.Z_SYNC_FLUSH)
c+=b.compress(b"leaf")
c+=b.flush()
print(z.decompress(c))

[1] [2]

إنهاء أم متابعة؟

المصدر يمرر وضع التفريغ إلى مكتبة zlib؛ عند النهاية ينهي حالة الضاغط. أما التفريغ المتزامن في مثالنا فيتركه قابلًا للمتابعة. [1] [2]

التفريغ المتزامن يسمح بمتابعة leaf ثم إنهاء التدفق
متابعة ثم إنهاء. [1] [2]

حدود المثال

المخرجان error ثم b'budleaf'. احتفظنا بمخرج كل ضغط وتفريغ للكائن الثاني، بما فيه التفريغ النهائي. لا يكفي جزء المخرج وحده لتمثيل التدفق الكامل. [1] [2]

المراجع

  1. Python 3.12: compressor flush
  2. CPython 3.12.14: compressor methods
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.