Веб-версияОткрыть в Telegram

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

4 июня 2025
К
Коробка с питоном
Ссылка
нажмите — покажем
😎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 #библиотека
20 · 689 ·

Рядом в ленте

ККоробка с питономПомните про такую старинную питонячью забаву - гуй/фронтенд через Python рисовать? Я даже пару постов делал об этом (тык, тык) - но все эти инструменты были "нуККоробка с питономniquests - молодой преемник requests Долгое-долгое время всеми нами любимая библиотека request для http запросов была де-факто стандартом. Но время шло, в питон
это сообщение
ККоробка с питоном💡 asyncssh - асинхронный ssh клиент и не только 👀 Если вы будете искать асинхронную альтернативу paramiko (это реализация SSHv2 на чистом питоне), то скорее всеККоробка с питоном🔩 Если вам понадобится в рантайме поменить тип принимаемого объекта в роуте FastAPI, вот вам небольшой рецепт. 😆 Для одного проекта я решил сделать плагин-систе
ККоробка с питономКоробка с питоном@boxwithpython · канал · Технологии
488подписчиков154постов в индексе
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем