CODEEXPLORE Telegram 4206
پیاده سازی 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
🔥7❤‍🔥4



tgoop.com/CodeExplore/4206
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

It’s easy to create a Telegram channel via desktop app or mobile app (for Android and iOS): Unlimited number of subscribers per channel Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. The creator of the channel becomes its administrator by default. If you need help managing your channel, you can add more administrators from your subscriber base. You can provide each admin with limited or full rights to manage the channel. For example, you can allow an administrator to publish and edit content while withholding the right to add new subscribers.
from us


Telegram کداکسپلور | CodeExplore
FROM American