تكرار السؤال: …
الإجابة المختصرة
توفر أدوات لبناء ودمج مديري السياق: contextmanager لكتابة مدير بـ generator، و ExitStack لإدارة عدد متغير من الموارد، و suppress لتجاهل استثناء محدد، و closing و nullcontext.
الشرح
مدير السياق يقلل تكرار try/finally ويضمن دورة حياة المورد. ExitStack مفيدة عندما لا تعرف عدد الملفات أو الاتصالات مسبقًا، فهي تضمن إغلاق كل ما فُتح حتى لو فشل فتح أحدها. و suppress تجعل تجاهل خطأ متوقع صريحًا ومحدودًا. وللكود غير المتزامن توجد asynccontextmanager و AsyncExitStack.
مثال بالكود
from contextlib import ExitStack, suppress
import os
def merge(paths: list[str], out: str) -> None:
with ExitStack() as stack:
files = [stack.enter_context(open(p)) for p in paths]
with open(out, "w") as target:
for f in files:
target.write(f.read())
with suppress(FileNotFoundError):
os.remove("tmp.lock")أخطاء شائعة
- فتح عدة ملفات في حلقة دون ضمان إغلاق ما فُتح منها عند فشل أحدها.
- استخدام suppress(Exception) فيختفي كل خطأ بدل الخطأ المتوقع فقط.