فصل چهارم: Context Manager، Type Hints و Dataclass

دستور with و نوشتن context manager سفارشی

مدیریت خودکار منابع با with

پیش‌تر دیده‌اید که دستور with برای باز و بسته کردن خودکار فایل استفاده می‌شود. این رفتار بر پایه‌ی پروتکلی به نام context manager ساخته شده که هر شیء با پیاده‌سازی دو متد __enter__ و __exit__ می‌تواند از آن پشتیبانی کند.

class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        import time
        print(f"زمان سپری‌شده: {time.time() - self.start:.4f} ثانیه")
        return False

with Timer():
    total = sum(range(1_000_000))

متد __enter__ هنگام ورود به بلوک with اجرا می‌شود و مقدار بازگشتی آن (در صورت استفاده از as) در اختیار قرار می‌گیرد. متد __exit__ نیز صرف‌نظر از این‌که خطایی رخ داده باشد یا نه، در پایان بلوک اجرا می‌شود؛ همین ویژگی است که آن را برای مدیریت منابعی مانند فایل، اتصال شبکه یا قفل (lock) بسیار مناسب می‌کند.

روش کوتاه‌تر برای نوشتن context manager، استفاده از دکوراتور @contextmanager از ماژول contextlib است که در درس بعد بررسی می‌کنیم و نیاز به تعریف کلاس جداگانه را حذف می‌کند.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.