🔹 چطوری تو پایتون تابع Overloading تمیز بنویسیم؟
خیلی وقتها پیش میاد که میخوایم یه تابع بستگی به اینکه چه جنس ورودیای (String, List, Dict...) بهش میدیم، رفتار متفاوتی داشته باشه. روش مبتدیانه چیه؟ نوشتن یه سلسله if isinstance(...) طولانی!
اما روش سینیورها توی پایتون استفاده از singledispatch از کتابخونه استاندارد functools هست.
from functools import singledispatch
@singledispatch
def process_data(data):
raise NotImplementedError("این تایپ پشتیبانی نمیشه!")
@process_data.register(str)
def _(data):
return f"متن پردازش شد: {data.upper()}"
@process_data.register(list)
def _(data):
return f"لیست پردازش شد با طول: {len(data)}"
@process_data.register(dict)
def _(data):
return f"کلیدهای دیکشنری: {list(data.keys())}"
# تست تابع
print(process_data("hello")) # متن پردازش شد: HELLO
print(process_data([1, 2, 3])) # لیست پردازش شد با طول: 3
🔹به چه دردی میخوره؟
کد بسیار کپسوله، خلوت و خوانا میشه.
اصل Open/Closed رعایت میشه (میتونی بعداً بدون دست زدن به تابع اصلی، تایپ جدید اضافه کنی).
🐍 @python_rd