Python Glossary English

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Сообщить о неточности