Python 3.4+functoolsпонятие
functools.singledispatch
диспетчеризация
Декоратор для создания обобщённых функций с диспетчеризацией по типу первого аргумента. Регистрация через @func.register.
Синтаксис
@functools.singledispatch
@func.register(type)
Реализация выбирается только по типу первого аргумента и только если он передан позиционно — по имени его передать нельзя, а остальные аргументы на выбор не влияют. Тип ищется по MRO, поэтому подкласс подхватит реализацию, зарегистрированную для базового класса или ABC; с версии 3.7 тип можно не писать в register, а взять из аннотации, с 3.11 понимаются и union-аннотации вида int | float. Для методов класса это не работает — там нужен singledispatchmethod.
Примеры
from functools import singledispatch
@singledispatch
def process(arg):
return f'unknown: {arg}'
@process.register(int)
def _(arg): return f'int: {arg * 2}'
@process.register(str)
def _(arg): return f'str: {arg.upper()}'
print(process(5)) # → int: 10
print(process('hi')) # → str: HI
print(process(3.14)) # → unknown: 3.14
print(process([1, 2])) # → unknown: [1, 2]
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности