0Pricing
Python Academy · درس

عبارة with بالتفصيل

افهم آلية عمل with وسبب منعها لتسرّب الموارد

عبارة with بالتفصيل درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

يضمن بيان ‎with‎ تنفيذ شيفرة الإعداد والتنظيف حتى عند وقوع استثناءات.

الاستخدام الأساسي لـ ‎with‎

‎with expr as var:‎ — يجب أن تُرجع ‎expr‎ مدير سياق. ويرتبط ‎var‎ بالقيمة التي يُرجعها ‎__enter__‎.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

لماذا يوجد ‎with‎؟

يجب تحرير الموارد مثل الملفات والأقفال واتصالات قواعد البيانات. ويضمن ‎with‎ التنظيف حتى إذا قاطع استثناء تنفيذ جسم البيان.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

مديرو سياق متعددون

يفتح ‎with open(a) as f, open(b) as g:‎ موردين في بيان واحد. ويُغلَق كلاهما عند الخروج.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

لا يخفي ‎with‎ الاستثناءات

تنتقل الاستثناءات في جسم ‎with‎ إلى الخارج افتراضيًا. ويمكن لـ ‎__exit__‎ إخفاؤها عبر إرجاع ‎True‎.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

القفل كمدير سياق

يعمل ‎threading.Lock()‎ كمدير سياق: يضمن ‎with lock:‎ تحرير القفل دائمًا.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

نمط اتصال قاعدة البيانات

تُجري وصلة قاعدة البيانات، بصفتها مدير سياق، عملية تثبيت عند النجاح وتتراجع عن التغييرات عند وقوع استثناء — وهو نمط بالغ الأهمية.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

بيانات ‎with‎ متداخلة

لا مشكلة في تداخل بيانات ‎with‎. يخرج مدير السياق الداخلي أولًا، ثم يخرج المدير الخارجي.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

‎contextlib.suppress‎

يبتلع ‎contextlib.suppress(ExcType)‎ بصمت نوعًا محددًا من الاستثناءات داخل كتلة ‎with‎.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

‎contextlib.redirect_stdout‎

يعيد ‎contextlib.redirect_stdout(f)‎ توجيه مخرجات ‎print()‎ إلى ‎f‎ مؤقتًا.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

‎ExitStack‎

يدير ‎contextlib.ExitStack‎ عددًا ديناميكيًا من مديري السياق، وهو مفيد عندما لا تعرف عدد الملفات التي ستفتحها.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

تحقق سريع

ماذا يفعل ‎contextlib.suppress(FileNotFoundError)‎؟

مراجعة

يضمن ‎with‎ التنظيف. ويمكن استخدام أهداف متعددة في ‎with‎ واحد. ويسكت ‎contextlib.suppress‎ أخطاء محددة. ويدير ‎ExitStack‎ أعدادًا ديناميكية من مديري السياق.

واصل التقدم

عمل رائع! الدرس التالي بانتظارك.

الأسئلة الشائعة

هل درس «عبارة with بالتفصيل» مجاني؟

نعم — نص درس «عبارة with بالتفصيل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «عبارة with بالتفصيل»؟

افهم آلية عمل with وسبب منعها لتسرّب الموارد تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «عبارة with بالتفصيل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. عبارة with بالتفصيل
  2. بروتوكول __enter__ و__exit__
  3. contextlib: @contextmanager
  4. أنماط مديري السياق العملية
← العودة إلى Python Academy