🔹دستور with رو همه برای باز کردن فایل (open) میشناسند، اما قدرتش خیلی بیشتر از این حرفهاست. هر جایی که نیاز به الگوی "آمادهسازی -> اجرا -> تمیزکاری" داری، Context Manager نجاتدهنده است.
🔹دو روش ساخت Context Manager سفارشی:
.روش اول: استفاده از Magic Methodها
با تعریف متدهای enter و exit در کلاس:
import time
class Timer:
def __enter__(self):
self.start = time.perf_counter()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.perf_counter()
print(f"زمان اجرا: {self.end - self.start:.4f} ثانیه")
# اگر True برگردانی، خطاهای داخل بلوک with سائلنت میشوند!
return False
with Timer():
# کدی که میخواهی زمان اجرای آن سنجیده شود
sum(i**2 for i in range(1_000_000))
🔹روش دوم: راهکار سریعتر با contextlib
بدون نیاز به نوشتن کلاس و فقط با یک Generator:
from contextlib import contextmanager
@contextmanager
def managed_resource():
print("۱. تخصیص منبع (Connect / Open)")
try:
yield "Resource Object"
finally:
print("۲. آزادسازی منبع (Disconnect / Close)")
# استفاده:
with managed_resource() as res:
print(f"در حال کار با {res}")
🔹 به چه دردی میخوره؟
مدیریت Transactionهای دیتابیس، قفلهای Multithreading، و اندازهگیری زمان اجرای سرویسها.
🐍 @python_rd