تقنية

chunk في بايثون 3.12: لماذا يتجاوز tell حجم البيانات؟

الحجم ثلاثة والموضع أربعة
مثال مؤلف. [1] [2] [3]

نقرأ كتلة مؤلفة في مخزن بالذاكرة. [1] [2] [3]

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

الموضع هنا يحتسب بايت المحاذاة؛ ليس حجم البيانات المعادة. [1] [2] [3]

  • read() يعيد b'ABC': ثلاثة بايتات. [1] [2] [3]
  • getsize() يعيد 3، دون الترويسة. [1] [2] [3]
  • tell() للكتلة يعيد 4 بعد استهلاك بايت المحاذاة. [1] [2] [3]
  • موضع المخزن 12: ترويسة 8 وبيانات 3 ومحاذاة 1. [1] [2] [3]
  • شُغّل المثال على 3.12.14؛ المكتبة مهجورة منذ 3.11 ومحذوفة منذ 3.13. [1] [2] [3]

المثال

import io,chunk
raw=b"OWN1"+(3).to_bytes(4,"big")+b"ABC\0"
with io.BytesIO(raw) as f:
 c=chunk.Chunk(f)
 print(c.read())
 print(c.getsize(),c.tell(),f.tell())
 c.close()

[1] [2] [3]

ثلاثة أعداد

بعد الترويسة يقرأ التنفيذ البيانات الثلاثة وبايت المحاذاة، لكنه يعيد البيانات فقط. لذلك يطبع السطر الثاني 3 4 12: حجم البيانات، موضع الكتلة، موضع المخزن. [1] [2] [3]

ثمانية وثلاثة وواحد
المجموع 12 بايتًا. [1] [2] [3]

الحدود

في فحصنا مع align=False تصبح المواضع 3 و11، ويبقى الحشو غير مستهلك. ليست المواضع عدد محارف. هذا مثال قديم في الذاكرة، لا محلل لكل ملف صوتي أو كتلة تالفة. [1] [2] [3]

المراجع

  1. Python3.12: chunk.Chunk
  2. CPython3.12.14: chunk.py
  3. Python: chunk removal
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

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