TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #284 2.18K
Наверняка вы знаете что такое перегруженная функция в С++. Если нет, то всё просто.
В С++ можно создать несколько функций с одинаковым названием но разными типами аргументов. И это будут разные функции.
Во время вызова функции будет выбрана та её версия которая подходит по типам аргументов. Такая конструкция называется параметрический полиморфизм.
Это удобно, когда мы точно не знаем какого типа прилетит аргумент и хотим обработать разные ситуации.

Как мы это поведение можем повторить в Python? Обычно через проверку типов.

def func(value):
if isinstance(value, int):
return func_int(value)
elif isinstance(value, str):
return func_str(value)
else:
raise NotImplementedError

Не очень красиво 🧐
Начиная с версии 3.4 в Python добавили способ делать "перегруженные" функции более элегантно. Это декоратор singledispatch.

Создадим нашу исходную функцию которая по умолчанию выбрасывает ошибку.

@singledispatch
def func(value)
raise NotImplementedError

Декоратор добавил для объекта func новую функцию register() с помощью которой можем регистрировать перегруженные функции.
В качестве аргумента указывайте тип который данная функция обрабатывает

@func.register(int)
def func_int(x):
print("INT:", x)

Вместо указания типа в аргументах можно использовать аннотации аргумента функции

@func.register
def func_str(x: str):
print("STR:", x)

Если не указать тип одним из этих способов то получите ошибку TypeError.

Имя новой функции не имеет значения, часто её называют просто "_"

@func.register(list)
def _(x):
print("LIST", x)

Если одна функция должна обработать несколько типов, то просто наслаиваем декоратор

@func.register(float)
@func.register(Decimal)
def _(x):
print(f'{type(x).__name__.upper()}:', x)

Теперь у нас есть 5 отдельных функций которые вызываются в зависимости от типа передаваемого аргумента. При этом всё выглядит логично и компактно. Обработка каждого случая находится в своей отдельной функции!

>>> func(1)
INT: 1
>>> func('Python')
STR: Python
>>> func(1.2)
FLOAT: 1.2
>>> func({})
NotImplementedError

------
◽️ Данный способ работает только с первым аргументом. Все остальные аргументы будут переданы как есть и не участвуют в выборе нужной функции.
◽️ В версии 3.8 доступен декоратор singledispatchmethod с таким же функционалом но для методов класса.

#tricks #libs
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
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 →