hody.ir

دوره صفر تا صد پایتون | آشنایی با Context manager در پایتون

32-آشنایی با Context manager در پایتون

جلسه ۳۲ دوره صفر تا صد پایتون

در جلسات قبلی دوره صفر تا صد پایتون با فایل ها و نوشتن و خواندن از آنها آشنا شدیم. در این جلسه با Context manager ها و استفاده از آنها در پایتون آشنا می‌شویم.

Context manager چیست؟

Context manager ها به شما قابلیت بستن یک ارتباط ( مثل یک فایل یا دیتابیس ) را به طور اتوماتیک می‌دهند. شما دیگر نیاز ندارید به عنوان مثال متد close را از فایل ها صدا بزنید و فقط کافی است کد موردنظر خود را در داخل Context manager بنویسید.

Context manager ها در برنامه بزرگ که ممکن است خطایی رخ بدهد ( به عنوان مثال فایل بسته نشود ) بسیار مفید است.

یکی از پر استفاده ترین نوع از Context manager ها ،‌ with است. در این نوع ابتدا شما کلاسی که میخواهید را به ورودی اول میدهید و به ورودی دوم شی موردنظر شما و سپس در داخل with کد موردنظر را می‌نویسید.

آشنایی با سینکس with

سینکس with به شکل زیر است:

with class as object:
    code...

همانطور که می‌بینید اولین ورودی کلاس است. به عنوان مثال میتوانیم از کلاس file استفاده کنیم چون قابلیت بسته شدن دارد و استفاده درستی از with است.

دومین ورودی آبجکتی است که از کلاس ورودی ایجاد می‌شود.

در آخر کد شما داخل بلوک with قرار می‌گیرد.

مثال :

with open('myfile.txt','w+') as wfile:
    wfile.write('Hody.ir\n')
    wfile.write('Python course')

همانطور که می‌بینید نیازی به بستن فایل نیست و خود with کار را انجام می‌دهد.

یکی دیگر از قابلیت های مهم with این است که در هر صورت فایل/آبجکت مورد نظر با می‌بندد. مثال :

with open('myfile.txt','w+') as wfile:
    wfile.write('Hody.ir\n')
    raise Exception('For no reason')
    wfile.write('Python course')

خروجی:

Traceback (most recent call last):
  File "program.py", line 3, in <module>
    raise Exception('For no reason')
Exception: For no reason

مقدار فایل:

Hody.ir

اما اگر اینکار را بدون استفاده with انجام میدادیم:

wfile = open('myfile.txt','w+')
wfile.write('Hody.ir\n')
raise Exception('For no reason')
wfile.write('Python course')
wfile.close()

خروجی:

Traceback (most recent call last):
  File "program.py", line 3, in <module>
    raise Exception('For no reason')
Exception: For no reason

مقدار فایل:

Hody.ir

اما حالا نمیتوان فایل را بدرستی ویرایش کرد.

ساخت یک class با قابلیت کار با with

برای اینکه بتوانیم کلاس خود را به شکلی درست کنیم که با with کار کند باید از دو magic method در کلاسمان استفاده کنیم.

این دو متد __enter__ و __exit__ هستند.

متد __enter__ هیچ ورودی ندارد اما خروجی آن آبجکتی است که به ورودی دوم with داده می‌شود.

متد __exit__ هیچ خروجی ای ندارد اما سه ورودی دارد. این متد زمانی استفاده می‌شود که آبجکت بسته می‌شود. ورودی های این متد:

type: این مقدار نوع اروری است که در صورت داشتن ارور در with اجرا می‌شود.

value: این مقدار خود متن اروری است که در صورت داشتن ارور در with اجرا می‌شود.

traceback: این مقدار آبجکتی است که باعث ارور شده است.

مثال:

class myclass:
    def run(self):
        print('object run')

    def __enter__(self):
        print('object get')
        return self
    
    def __exit__(self,type,value,traceback):
        print('object closed')
        print(f'type:{type}')
        print(f'value:{value}')
        print(f'traceback:{traceback}')

with myclass() as a:
    a.run()
    print('run')
    raise Exception('Something went wrong')
object get
object run
run
object closed
type:<class 'Exception'>
value:Something went wrong
traceback:<traceback object at 0x7f46a95bcbc0>

همینطور که میبینید در صورت ارور __exit__ اجرا می‌شود و اطلاعات ارور به ورودی ها داده می‌شود.

به این شکل میتوان در صورت رخ دادن ارور در آبجکت ، ارور را بررسی کنیم و برنامه را ادامه دهیم.

این جلسه از دوره صفر تا صد پایتون به پایان رسید. در جلسات بعدی با lambda آشنا می‌شویم.

0 0 vote
Article Rating
Subscribe
اطلاع از
guest
0 Comments
Inline Feedbacks
View all comments