TGViewer
PyCoders (پایتون) PyCoders (پایتون) @python_rd · 4.1K subscribers
Post #2163 520
🔆 تا حالا شده یک تابع داشته باشی که مجبور باشه چند نوع ورودی مختلف رو پردازش کنه؟

🔹مثلاً برای پردازش لاگ‌های یک سیستم، ورودی ممکنه یک متن ساده، یک لیست از خطاها یا یک دیکشنری شامل اطلاعات کامل لاگ باشه.

🔹روش معمولی احتمالاً این شکلیه:

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
More from @python_rd
  1. Oct 13, 2026کوییز پایتون 🔆 خروجی اجرای کد زیر چیست؟ t = (1, 2, [3, 4]) try: t[2] += [5] except TypeEr…
  2. Oct 13, 2026🔆 راز مکانیزم پیاده‌سازی و تغییر جهت NaN در الگوریتم مرتب‌سازی پایتون (Timsort) 🔹 باگ ری…
  3. Oct 13, 2026🔆 حذف تاریخی GIL از پایتون (Free-threaded Python) 🔹 یک رویداد تاریخی: حذف قفل مفسر (GIL)…
  4. Oct 11, 2026🔆 مدیریت تمیز منابع با Context Managerهای سفارشی (contextlib) 🔹 ساخت Context Managerها م…
  5. Oct 10, 2026🔆 چرا برای داده‌های حجیم نباید از return استفاده کنی؟ 🔹 وقتی یک تابع لیست بزرگی از داده‌…
  6. Oct 10, 2026🔆 خروجی این تکه کد چیه؟ def add_item(item, lst=[]): lst.append(item) return lst print(add…
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 →