contextlib: @contextmanager
أنشئ مديري سياق بإيجاز باستخدام مزخرف contextlib
contextlib: @contextmanager درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
لماذا contextlib؟
تتيح لك contextlib.contextmanager كتابة مدير سياق باعتباره دالة مولّدة بدلًا من فئة، مما يقلل الشيفرة التمهيدية.
from contextlib import contextmanager
@contextmanager
def managed():
print("setup")
yield
print("teardown")
with managed():
print("inside")إرجاع قيمة
أي قيمة تستخدم معها yield تُربط بمتغير as في تعليمة with.
from contextlib import contextmanager
@contextmanager
def temp_list():
lst = []
yield lst
print(f"Final list: {lst}")
with temp_list() as lst:
lst.append(1)
lst.append(2)معالجة الاستثناءات في @contextmanager
ضع yield داخل try/finally لضمان التنظيف حتى عند حدوث استثناء.
from contextlib import contextmanager
@contextmanager
def safe_open(path):
f = open(path)
try:
yield f
finally:
f.close()
with safe_open("data.txt") as f:
print(f.read())كبت الاستثناءات
التقط الاستثناء داخل المولّد لكبته — وهذا يعادل إعادة True من __exit__.
from contextlib import contextmanager
@contextmanager
def ignore_value_errors():
try:
yield
except ValueError:
pass
with ignore_value_errors():
raise ValueError("ignored")contextlib.suppress
إن contextlib.suppress(*exceptions) مدير سياق جاهز يكبت أنواع الاستثناءات المحددة.
from contextlib import suppress
with suppress(FileNotFoundError):
open("missing.txt")
print("continues")contextlib.closing
تنشئ closing(obj) مدير سياق يستدعي obj.close() عند الخروج. وهي مفيدة للكائنات التي تملك close() ولا تملك __exit__.
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen("https://example.com")) as page:
content = page.read()contextlib.nullcontext
إن nullcontext مدير سياق لا ينفّذ أي إجراء. وهو مفيد عندما يكون مدير السياق اختياريًا.
from contextlib import nullcontext
def process(data, lock=None):
cm = lock if lock is not None else nullcontext()
with cm:
return [x*2 for x in data]contextlib.ExitStack
يتيح لك ExitStack إدارة عدد متغير من مديري السياق بشكل ديناميكي.
from contextlib import ExitStack
files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
handles = [stack.enter_context(open(f)) for f in files]
data = [h.read() for h in handles]إعادة استخدام @contextmanager
مدير السياق القائم على مولّد يُستخدم مرة واحدة في كل استدعاء. استدعِ الدالة المزينة مرة أخرى لإعادة استخدامه.
from contextlib import contextmanager
@contextmanager
def counter():
count = 0
yield lambda: count.__add__ # each call is independent
print("done")
with counter():
pass
with counter():
passasynccontextmanager
في الشيفرة غير المتزامنة، استخدم contextlib.asynccontextmanager لكتابة مديري async with على هيئة مولّدات.
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_session():
session = await create_session()
try:
yield session
finally:
await session.close()contextlib.redirect_stdout
أعِد توجيه المخرجات القياسية مؤقتًا إلى أي كائن يشبه الملف.
import io
from contextlib import redirect_stdout
buf = io.StringIO()
with redirect_stdout(buf):
print("captured")
print(buf.getvalue()) # capturedتحقق سريع
في مولّد @contextmanager، أين يجب وضع شيفرة التنظيف لضمان تنفيذها حتى عند حدوث استثناء؟
مراجعة
تحوّل @contextmanager المولّد إلى مدير سياق. استخدم try/finally حول yield لإجراء تنظيف آمن. وتوفر الوحدة contextlib أيضًا suppress وnullcontext وExitStack وغيرها.
الأسئلة الشائعة
هل درس «contextlib: @contextmanager» مجاني؟
نعم — نص درس «contextlib: @contextmanager» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «contextlib: @contextmanager»؟
أنشئ مديري سياق بإيجاز باستخدام مزخرف contextlib تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «contextlib: @contextmanager»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عبارة with بالتفصيل
- بروتوكول __enter__ و__exit__
- contextlib: @contextmanager
- أنماط مديري السياق العملية