0Pricing
Python Academy · درس

أنماط مديري السياق العملية

طبّق مديري السياق على الملفات والأقفال والمؤقتات واتصالات قواعد البيانات

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

مقدمة

تحل مديري السياق مشكلات إدارة الموارد الواقعية بأناقة، سواء مع الملفات أو قواعد البيانات أو الأقفال أو المؤقتات وغير ذلك.

مسار معالجة الملفات

افتح ملفات الإدخال والإخراج معًا، وعالجها سطرًا بعد سطر، ثم أغلق الملفين تلقائيًا.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

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

غلّف عمليات قاعدة البيانات بمدير سياق: نفّذ commit عند النجاح، وrollback عند حدوث استثناء، وأغلق الاتصال دائمًا.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

قفل الخيوط

يستحوذ `with lock:` على القفل، وينفّذ الجسم، ثم يحرره عند الخروج — ولا حاجة إلى استدعاء acquire/release يدويًا.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

تغيير الدليل

تغيّر `os.chdir()` دليل العمل على مستوى البرنامج بالكامل. ويحفظ مدير السياق الدليل ثم يستعيده.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

الملفات المؤقتة

ينشئ `tempfile.NamedTemporaryFile` باعتباره مدير سياق ملفًا مؤقتًا ويحذفه تلقائيًا.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

تعديل متغيرات البيئة

عيّن متغير بيئة مؤقتًا لاختبار أو عملية فرعية، ثم استعد قيمته بعد ذلك.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

كتلة تحليل الأداء

غلّف كتلة باستخدام `cProfile` لقياس أدائها داخل مدير سياق.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

مقبس الشبكة

تطبّق المقابس بروتوكول مدير السياق: `with socket.socket() as s:` يغلق المقبس عند الخروج.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

التقاط التحذيرات

تلتقط `warnings.catch_warnings()` التحذيرات الصادرة داخل الكتلة، وهو أمر مفيد في الاختبارات.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

دمج الأنماط

غالبًا ما تجمع مديري السياق الواقعية عدة أنماط: معاملة وتسجيلًا وقياسًا للوقت في مكوّن واحد قابل لإعادة الاستخدام.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

تحقق سريع

أي بدائية من بدائيات الخيوط تطبّق بروتوكول مدير السياق لتوفير وصول متزامن آمن؟

مراجعة

أنماط مديري السياق: مسارات الملفات، ومعاملات قواعد البيانات، والأقفال، وتغييرات الأدلة، والملفات المؤقتة، وتعديلات متغيرات البيئة، وتحليل الأداء. استخدم ExitStack لمكدسات الموارد الديناميكية.

واصل التقدم

أحسنتم! الدرس التالي في انتظاركم.

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

هل درس «أنماط مديري السياق العملية» مجاني؟

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

ماذا ستتعلم في «أنماط مديري السياق العملية»؟

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

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

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

كم من الوقت يستغرق درس «أنماط مديري السياق العملية»؟

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

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

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

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

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