TGStat
TGStat
Qidiruv uchun matnni kiriting
Ilg‘or kanal qidiruvi
  • flag Uzbek
    Sayt tili
    flag Russian flag English flag Uzbek
  • Saytga kirish
  • Katalog
    Kanal va guruhlar katalogi Hududiy to‘plamlar Tematik to‘plamlar Платные каналы Kanallar qidiruvi
    Kanal/guruh qo‘shish
  • Reytinglar
    Kanallar reytingi Guruhlar reytingi Postlar reytingi
    Brendlar va shaxslar reytingi
  • Analitika
  • Postlarda qidiruv
  • Telegram'ni kuzatish
  • Targ‘ibot
    Yandex Business orqali reklama TGStat Agency orqali kanallarda reklama TGStat.ru saytida reklama
Коробка с питоном

4 Jun 2025, 19:00

Telegram'da ochish Ulashish Shikoyat qilish

😎ovld - перегрузка функций по-человечески

👩‍💻 Наверняка любой из нас когда-то писали код по типу этого:
def process(x: str | int) -> None:
if isinstance(x, int):
do_for_int(x)
elif isinstance(x, str):
do_for_str(x)

🙈 А пишем мы так потому-что в Python из под коробки нет нормальной поддержки ad-hoc полиморфизма, аля перегрузки методов.
❓ Ad-hoc полиморфизм - это возможность вызывать одну и ту же функцию с разными типами данных, при этом для каждого типа вызывается своя реализация. Например в Java мы можем написать что-то такое и это будет работать:
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; }
public String add(String a) { return a; }

🆘 А что делать, если хочется такое в Python? Есть несколько вариантов:
1. В стандартной библиотеке есть есть functools.singledispatch и functools.singledispatchmethod, но корректно они работают только с 1 аргументом 🤬:
from functools import singledispatch

@singledispatch
def process(x: Any):
print(f"Общий случай: {x}")

@process.register
def _(x: str):
print(f"Строка: {x}")

@process.register
def _(x: str, y: int): # сработает, но и сломает предыдущий обработчик
print(f"{x=}, {y=}")

2. Одно время часто советовали multipledispatch, но у него ряд недостатков - его не любят IDE, тайпинги не поддерживает, да и вообще всё еще стремно выглядит ⚰️:
from multipledispatch import dispatch

@dispatch(int, int) # никаких тайп хинтов, только вот так
def add(x, y):
return x + y

@dispatch(object, object)
def add(x, y):
return f"{x} + {y}"

add(1, 2) # 3
add(1, 'hello') #'1 + hello'

3. А еще можно использовать ovld 😎. Что он умеет?
- 👩‍💻 Перегружает по тайп-хинтам
- 👩‍💻 Полноценно работает с IDE и автодополнением (правда с pyright у меня иногда случаются нюансы)
- 😎 Умеет нормально работать с вложенными аннотациями (аля list[tuple[str, int])
- 😈 Не требует регистрации базовой функции (как в singledispatch)
- 💨 да и работает достаточно быстро (хотя куда без нюансов)?

А теперь небольшой примерчик:

from ovld import ovld

@ovld
def f(x: str):
return f"Строка {x!r}"

@ovld
def f(x: int):
return f"Число {x}"

@ovld
def f(x: int, y: int):
return "Джва числа!"

Ну красиво же? Я уже молчу при всякие фичи в виде кодгена, миксинов, метакласса который проставляет декоратор как бы за вас, типов зависимых по значению (есть проверка текста по регуляркам) и еще много всего!

GitHub | Документация | PyPi
#библиотека
GitHub - mrocklin/multipledispatch: Multiple dispatch
Multiple dispatch. Contribute to mrocklin/multipledispatch development by creating an account on GitHub.

501 0 16 20 25
Katalog
Kanal va guruhlar katalogi Kanallar to‘plamlari Kanallar qidiruvi Kanal/guruh qo‘shish
Reytinglar
Telegram-kanallar reytingi Telegram-guruhlar reytingi Postlar reytingi Brendlar va shaxslar reytingi
API
Statistika API'si Postlar qidiruvi API'si API Callback
Kanallarimiz
@TGStat @TGStat_Chat @telepulse @TGStatAPI
O‘qish
Академия TGStat Telegram tadqiqoti 2019 Telegram tadqiqoti 2021 Telegram tadqiqoti 2023
Kontaktlar
Справочный центр Qo‘llab-quvvatlash Email Vakansiyalar
Har xil narsalar
Foydalanuvchi shartnomasi Maxfiylik siyosati Ommaviy oferta
Botlarimiz
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot