الدرس 10 من 10

التنظيف المضمون

هدف الدرس

with يحرّر المورد مهما حدث

01

الشرح

الكود الحالي يأخذ القفل ثم يحرّره، وبينهما سطر قد يرمي. فإن رمى لم يصل التنفيذ إلى release: يبقى القفل مأخوذًا إلى الأبد، ويفشل كل استدعاء بعده. شغّله وانظر.

with يضمن التنظيف: يستدعي __enter__ عند الدخول، وما يُرجعه يصل إلى as، ثم يستدعي __exit__ عند الخروج أيًّا كان سببه، نهايةً طبيعية أو استثناءً. وهكذا يعمل with open(...): تكتب التنظيف مرّة واحدة في الصنف، بدل try/finally في كل مكان يُستعمل فيه.

والفخّ: __exit__ يستقبل تفاصيل الاستثناء، وإن أرجع True ابتلعه كأنه لم يقع. لا تُرجع شيئًا، فيكمل الخطأ طريقه إلى من يعالجه. وللدوال بديل أقصر: @contextlib.contextmanager مع yield داخل try/finally، ومن ينسى finally فيه يعيد المشكلة نفسها.

02

المطلوب

أضف إلى Lock دالة __enter__ تأخذ القفل وتُرجع self، ودالة __exit__ تحرّره دائمًا ولا تبتلع الخطأ، ثم أعد كتابة update بـwith lock:.

معايير التصحيح

6 معايير
  1. داخل with القفل مأخوذ
  2. as يعطي القفل نفسه
  3. يُحرَّر عند الخروج الطبيعي
  4. ويُحرَّر حتى لو رمى الكود داخله
  5. ولا يبتلع الخطأ
  6. update تحرّر القفل رغم الخطأ
main.py
المخرجاتPython · Pyodide

جارٍ تحميل بيئة بايثون… تُحمَّل مرّة واحدة ثم يحفظها المتصفح.

–/6

يبدأ الفحص حين تجهز البيئة.

6 معايير في بطاقة «المطلوب».