context manager توی پایتون چیه؟ به چه دردی میخوره و چطور میشه یکی نوشت؟

این سوالی بود که توی یکی از مصاحبه های کاری از من پرسیده شد و مدیر فنی اون شرکت میگفت توی یک پروژه ما نیاز داشتیم خودمون یک context manager بنویسیم.

بدلیل محدودیت منابع در سیستم، وجود مکانیزمی که برای مدیریت منابع یعنی گرفتن و رهاسازی اتوماتیک منابع می تواند به مدیریت منابع و جلوگیری از آن کمک کند. منابعی مثل فایل، کانکشن های دیتابیس و … این وظیفه context manager هست

توی پایتون برای باز کردن یک فایل میشه از کلیدواژه with استفاده کنیم. اینجا دقیقا داریم از یک context manager استفاده میکنیم. context manager به ما اجازه میده که یک resource رو به خوبی allocate کنیم و بعد از استفاده آزاد کنیم. فرض کنید که دو عملیات مرتبط دارید و میخاید این دو عملیات با هم به صورت جفتی توی یک بلاک کد انجام بشه، context manager به شما این امکان رو میده که این کار رو انجام بدید. مثلا میخایم یک فایل رو باز کنیم و توش بنویسیم و اگر در حین نوشتن توی فایل به ارور خوردیم فایل خودبه خود بسته بشه، یعنی یه جورایی این فایل که یک resource هست رو allocate کردیم و در آخر هم به درستی آزادش میکنیم و عملا هم این چندتا کار به هم مرتبط هستن و باید جفتی با هم توی یه بلاک کد انجام بشه: باز کردن نوشتن و بستن.

کد زیر دقیقا معادل کد بالاست وقتی که از context manager استفاده نکنیم. میبینید که اولا از کد بیشتری استفاده شده ثانیا دو عملیاتی که بهم مرتبط هستند و بهتر بود در یک بلاک کد استفاده شود از هم جدا شدند:

پیاده سازی context manager به صورت class

فقط با تعریف کردن متدهای __enter__ و __exit__ یک context manager ساخته ایم و میتوانیم از آن در بلاک with استفاده کنیم

جزئیات بیشتر در لینک زیر موجوده

https://book.pythontips.com/en/latest/context_managers.html

use case های دیگه ای هم برا context manger توی لینک زیر میبینیم

https://www.geeksforgeeks.org/context-manager-in-python/

https://www.linkedin.com/pulse/context-managers-python-gautam-kumar/