ترفند پایتونی 3 – Context Managers

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

و به عنوان نمونه ای پر کاربرد می توان به باز و بسته کردن فایل ها اشاره کرد:

در حقیقت کد بالا به صورت زیر در پایتون اجرا خواهد شد:

یا به طور مثال در کلاس threading.Lock خواهیم داشت:
 

نحوه نوشتن Context Manager (class-based)

خود ما هم میتونیم این عملکرد رو در توابع و کلاس ها با استفاده از with داشته باشیم که به context manager معروفه!. context manager یک رویه هوشمندانه است که آبجکت ساخته شده توسط شما، دنبال می کنه. تمام کاری که لازمه برای ساخت یک context manager انجام بشه اینه که از متودهای از پیش ساخته شده (built-in method)، __enter__ و __exit__  استفاده کنیم. به طور مثال در کد زیر با شروع with متود enter اجرا میشه و عبارت Salam, Rahman  چاپ خواهد شد و بعد از انجام کدهای بلاک داخل with که در مثال زیر پرینت عبارت Good Work هستش، پروسه کد ما با عبارت موجود در متود exit بسته خواهد شد.

 

مثال دیگه همون مثال بازکردن یک فایله که در کد زیر پس از باز کردن فایل مورد نظر در حالت write، مقدار مورد نظر رو در فایل چاپ می کنیم و فایل هم در انتها بسته خواهد شد.

که برای استفاده به صورت زیر عمل می کنیم:

 

روش دیگر (generator-based)

البته برای استفاده و نوشتن context manager روش بالا تنها روش نیست و میشه از روش generator-based با استفاده از ماژول contextlib و decorator هم این عملکرد رو پیاده کرد.

 

مثال Indent

مثال دیگر از کاربرد context manager: کدی رو با context manager بنویسیم که خروجی، همانند شکل زیر داشته باشیم.

یا شاید به این صورت:

که با نوشتن کد زیر نتیجه بالا حاصل شود.

و اما کدی که این خروجی رو خواهد داشت:

 

مثال Code Block Timer

در این مثال مدت زمان اجرا کدی که در بلاک with قرار گرفته رو بدست خواهیم آورد:

 

 

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست