TGStat
TGStat
Type to search
Advanced channel search
  • flag English
    Site language
    flag Russian flag English flag Uzbek
  • Sign In
  • Catalog
    Channels and groups catalog Regional compilations Thematic compilations Платные каналы Search for channels
    Add a channel/group
  • Ratings
    Rating of channels Rating of groups Posts rating
    Ratings of brands and people
  • Analytics
  • Search by posts
  • Telegram monitoring
  • Promotion
    Advertising through Yandex Business Advertising in channels through TGStat Agency Advertising on TGStat.ru website
Коробка с питоном

4 Jun 2025, 19:00

Open in Telegram Share Report

😎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
Catalog
Channels and groups catalog Channels compilations Search for channels Add a channel/group
Ratings
Rating of Telegram channels Rating of Telegram groups Posts rating Ratings of brands and people
API
API statistics Search API of posts API Callback
Our channels
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Read
Академия TGStat Telegram Research 2019 Telegram Research 2021 Telegram Research 2023
Contacts
Справочный центр Support Email Jobs
Miscellaneous
Terms and conditions Privacy policy Public offer
Our bots
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot