🔹مثلاً برای پردازش لاگهای یک سیستم، ورودی ممکنه یک متن ساده، یک لیست از خطاها یا یک دیکشنری شامل اطلاعات کامل لاگ باشه.
🔹روش معمولی احتمالاً این شکلیه:
def process_log(data):
if isinstance(data, str):
print(f"Text log: {data.upper()}")
elif isinstance(data, list):
print(f"{len(data)} errors found")
elif isinstance(data, dict):
print(f"Log source: {data.get('source')}")
else:
print("Unknown data type")
🔹این کد فعلاً کار میکنه، اما هر بار که بخوای نوع جدیدی اضافه کنی، باید همین تابع رو تغییر بدی.
🔹اینجاست که
singledispatch وارد میشه.from functools import singledispatch
@singledispatch
def process_log(data):
print(f"نوع داده پشتیبانی نمیشود: {type(data).__name__}")
@process_log.register
def _(data: str):
print(f"لاگ متنی: {data.upper()}")
@process_log.register
def _(data: list):
print(f"تعداد خطاها: {len(data)}")
@process_log.register
def _(data: dict):
print(f"منبع لاگ:گ متنی: SERVER IS DOWN
process_log(["404 is down")
# لاگ متنی: SERVER IS DOWN
process_log(["404", "Timeout", "Database Error"])
# تعداد خطاها: 3
process_log({"source": "AuthService"})
# منبع لاگ: AuthService
🔹تابع اصلی فقط برای حالت پیشفرض استفاده میشه و هر نوع داده، پردازش مخصوص خودش رو داره.
🔹مزیتش اینه که بهجای ساختن یک تابع بزرگ پر از
if/elif، منطق هر نوع ورودی رو جدا مینویسی.🔹البته یک نکته مهم وجود داره:
singledispatch فقط بر اساس نوع اولین آرگومان تصمیم میگیره، نه بر اساس مقدار یا تعداد آرگومانها.🐍 @python_rd