TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Коробка с питоном

4 Jun 2025, 19:00

Открыть в Telegram Поделиться Пожаловаться

😎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
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot