مدیریت خودکار منابع با 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 است که در درس بعد بررسی میکنیم و نیاز به تعریف کلاس جداگانه را حذف میکند.