TGViewer
کداکسپلور | CodeExplore کداکسپلور | CodeExplore @codeexplore · 9.2K subscribers
Post #4206 1.72K
پیاده سازی 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
More from @codeexplore
  1. Oct 5, 2026😂😮 #fun ☕️ Telegram | Website | Discord
  2. Oct 5, 2026‏Vengeance UI مجموعه‌ای از Component های اوپن سورس انیمیشنی پر استفاده رو با افکتای مخ…
  3. Oct 4, 2026پشت هر شخصیت برنامه‌نویس، سال ها یادگیری، تلاش و آزمون‌وخطا وجود داره. ☕️ Telegram | Websi…
  4. Oct 4, 2026غول فناوری و هوش مصنوعی یک سرور قدرتمند برای نسل جدید پردازش‌های هوش مصنوعی و زیرساخت‌های…
  5. Oct 4, 2026Post #4848
  6. Oct 4, 2026اگر میخواید ساختار یه پروژه گیت هاب رو خیلی سریع و راحت بررسی کنید، GitDiagram میتونه کل ر…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →