تقنية

BytesIO في بايثون: لماذا يفشل close مع getbuffer؟

عرض حي يمنع close
قبل التحرير. [1] [2] [3]

نغلق مخزن بايتات مؤلفًا بعد تحرير عرضه. [1] [2] [3]

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

العرض الحي يمنع الإغلاق هنا. [1] [2] [3]

  • أنشأنا BytesIO(b'AB') في الذاكرة. [1] [2] [3]
  • getbuffer() يعيد عرضًا على المخزن. [1] [2] [3]
  • close() مع العرض يرفع BufferError. [1] [2] [3]
  • بعد v.release() ينجح الإغلاق؛ closed=True. [1] [2] [3]
  • اختبرنا 3.12.14؛ وجود عرض آخر يبقي القيد. [1] [2] [3]

المثال

from io import BytesIO
b=BytesIO(b"AB")
v=b.getbuffer()
try: b.close()
except BufferError: print("BufferError")
v.release()
b.close()
print(b.closed)

[1] [2] [3]

العرض والإغلاق

العرض الحي ليس نتيجة getvalue() من نوع bytes. في مثالنا يطبع BufferError ثم True. الإغلاق الأول لم ينجح؛ بقي المخزن مفتوحًا وبياناته AB. [1] [2] [3]

بعد release ينجح close
بعد التحرير. [1] [2] [3]

عرضان

اختبرنا عرضين مستقلين بـgetbuffer(): تحرير أحدهما لا يكفي. بعد تحرير الثاني نجح الإغلاق. لا تكتفِ بحذف اسم واحد وتفترض زوال كل العروض. [1] [2] [3]

الحدود

مخزن في الذاكرة، بلا ملف خارجي. نختبر الإغلاق فقط؛ لا نعمم تفاصيل تغيير الحجم أو الكتابة، ولا نقارن الأداء. [1] [2] [3]

المراجع

  1. Python: io
  2. CPython3.12.14: bytesio.c
  3. Python: memoryview.release
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

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