الدرس 10 من 10
التنظيف المضمون
- 15 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
with يحرّر المورد مهما حدث
الشرح
الكود الحالي يأخذ القفل ثم يحرّره، وبينهما سطر قد يرمي. فإن رمى لم يصل التنفيذ إلى release: يبقى القفل مأخوذًا إلى الأبد، ويفشل كل استدعاء بعده. شغّله وانظر.
with يضمن التنظيف: يستدعي __enter__ عند الدخول، وما يُرجعه يصل إلى as، ثم يستدعي __exit__ عند الخروج أيًّا كان سببه، نهايةً طبيعية أو استثناءً. وهكذا يعمل with open(...): تكتب التنظيف مرّة واحدة في الصنف، بدل try/finally في كل مكان يُستعمل فيه.
والفخّ: __exit__ يستقبل تفاصيل الاستثناء، وإن أرجع True ابتلعه كأنه لم يقع. لا تُرجع شيئًا، فيكمل الخطأ طريقه إلى من يعالجه. وللدوال بديل أقصر: @contextlib.contextmanager مع yield داخل try/finally، ومن ينسى finally فيه يعيد المشكلة نفسها.
المطلوب
أضف إلى Lock دالة __enter__ تأخذ القفل وتُرجع self، ودالة __exit__ تحرّره دائمًا ولا تبتلع الخطأ، ثم أعد كتابة update بـwith lock:.
معايير التصحيح
6 معايير- داخل with القفل مأخوذ
- as يعطي القفل نفسه
- يُحرَّر عند الخروج الطبيعي
- ويُحرَّر حتى لو رمى الكود داخله
- ولا يبتلع الخطأ
- update تحرّر القفل رغم الخطأ