tgoop.com/CodeExplore/4206
Create:
Last Update:
Last Update:
پیاده سازی Defer در پایتون🔥
شاید دلتون بخواد توی پایتونتون defer داشته باشید. با اینکه به صورت built-in همچین چیزی وجود نداره اما میتونید یا خودتون با دکوراتور ها یکی بسازید یا از لایبرری استفاده کنید.
روش اول(استفاده از لایبرری):
pip install defer
و نمونه استفاده اش:
from defer import defer
@defer
def main(d):
f = open("file.txt")
d(f.close) # in go: `defer f.close()`
print(f.read())
روش دوم(چرخو خودتون بسازید):
برای روش دوم باید یه سری چیزو بدونیم. دیفر در واقع یه فانکشن رو به عنوان ورودی میگیره و اونو زمان بندی میکنه. اما کی؟ لحظه آخری که تابع قراره به اتمام برسه. چطوری؟ با استفاده از ارور هندلینگ پایتون. میایم یه دکوراتور درست میکنیم و بعد از اینکه تابع کارش تموم شد، استک کال های دیفر رو به اجرا در میاریم.
🐾 پیاده سازی دکوراتور دیفر:
و نکته کد زیر اینه ما از ارور هندینگ استفاده میکنیم. ولی مهم نیست تابع چیزی raise کنه یا نکنه. در هر صورت باید کد توی بلاک Finally ران بشه که در واقع خالی کردن استک دیفر هست. و چه کد بدون خط و چه با خطا توی تابع جلو بره قبلا از اینکه تابع به پایان برسه و return بشه، finally اجرا میشه.
def defer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
deferred = [] # Store deferred functions as (fn, args, kwargs)
def d(fn, *a, **kw):
"""Register a function to run at the end of the main function (LIFO)."""
deferred.append((fn, a, kw))
try:
# Call the original function, passing in the defer collector
return func(d, *args, **kwargs)
finally:
# Run deferred functions in reverse order automatically
while deferred:
fn, a, kw = deferred.pop()
try:
fn(*a, **kw)
except Exception:
print("Exception in deferred function:")
traceback.print_exc()
return wrapper
و استفادش:
@defer
def example(d):
f = open("file.txt", "w")
d(f.close) # schedule file close
d(lambda: print("Deferred print 1"))
d(lambda: print("Deferred print 2"))
print("Inside function")
f.write("Hello from example!\n")
خروجی:
Inside function
Deferred print 2
Deferred print 1
البته این پست صرفا برای آشنایی با مکانیزم دیفره. چون شاید به ذهنتون برسه اینه که این پیاده سازی Pythonic نیست و میتونیم به جاش از With استفاده کنیم که خودش به صورت اتوماتیک این کارو انجام میده.
#defer #python
☕️Telegram | Website | Discord
BY کداکسپلور | CodeExplore
Share with your friend now:
tgoop.com/CodeExplore/4206