کداکسپلور | CodeExplore
7.93K subscribers
2.01K photos
347 videos
103 files
1.83K links
با کد اکسپلور یاد بگیر، لذت ببر و بروز باش ⚡️😉

سایت:
CodeExplore.ir
👨🏻‍💻 ارتباط با ما :
@CodeExploreSup
گروه :
@CodeExplore_Gap
تبلیغات در کد اکسپلور :
@CodeExploreAds
Download Telegram
کلمه کلیدی Defer چیه؟
کلمه کلیدی Defer یه کلمه کلیدی تو Go هست که باعث می‌شه یه تابع بعد از اتمام تابع فعلی اجرا بشه. این یعنی وقتی return زدی یا اروری اومد، اون تابع deferred آخر کار اجرا می‌شه.

چرا از defer استفاده کنیم؟
کلمه کلیدی defer خیلی به درد کارایی مثل اینا می‌خوره:

بستن فایل‌ها (file.Close())
بستن کانکشن‌ها یا منابع شبکه
آزاد کردن lockها (مثل mutex.Unlock())
گرفتن log یا اندازه‌گیری زمان اجرا

مثلاً:

func readFile() {
f, _ := os.Open("data.txt")
defer f.Close()

// ادامه‌ی کار با فایل...
}

🧠 چطوری کار می‌کنه؟
اگه چند تا defer پشت‌سرهم بنویسی، به صورت LIFO اجرا می‌شن؛ یعنی آخری اول اجرا می‌شه.

defer fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")

خروجی:

C
B
A

⚠️ نکته‌ی مهم
تو لوپ‌هایی که زیاد تکرار می‌شن، زیاد از defer استفاده نکن، چون ممکنه کارایی بیاد پایین. به‌جاش مستقیم اون تابع رو همون موقع صدا بزن.

🧹 جمع‌بندی
defer ابزار تمیزکاری تو Go هست. کمک می‌کنه کدت مرتب، ایمن و بدون نشتی منابع باشه. مخصوصا تو پروژه‌های واقعی خیلی کاربردیه!

اگه تجربه‌ کار با defer داری، تو کامنتا بنویس 👇🏻

#golang #defer
☕️Telegram | Website | Discord
🔥82
پیاده سازی 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