Декоратор, превращающий функцию в универсальную функцию одиночной диспетчеризации.
functools.singledispatch(func)
-> callable
func -- Функция, к которой следует сделать универсальной.

Универсальная (generic) функция — функция, составленная из нескольких функций, реализующих одну и ту же операцию для различных типов. Нужная реализация при этом определяется алгоритмом диспетчеризации.

Одиночная (single) диспетчеризация — алгоритм диспетчеризации для универсальных функций, при котором нужная реализация выбирается на основе типа одного аргумента.

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

    from functools import singledispatch


@singledispatch
def print_with_type(arg):
print('object: %s' % arg)


@print_with_type.register(int)
def _print_int(arg):
print('int: %s' % arg)


@print_with_type.register(list)
def _print_list(arg):
print('list: %s' % arg)


print_with_type(1) # int: 1
print_with_type([1, 2]) # list: [1, 2]
print_with_type('some') # object: some

print_with_type.dispatch(int) # < function _print_int at 0x7f5eac4877b8>
print_with_type.registry.keys() # dict_keys([< class 'int'>, < class 'list'>, < class 'object'>])

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

+py3.7 Тип можно не передавать в декоратор, а указать непосредственно в определении функции при помощи аннотации:

    @print_with_type.register
def _print_int(arg: int):
print('int: %s' % arg)

.registry
Декоратор добавит вашей функции атрибут registry, в котором будет содержаться словарь маршрутизации. Ключами в словаре будут являться типы, а значениями — функции, реализующие обработку для этих типов. Атрибут доступен только для чтения.

.dispatch()
Декоратор добавит вашей функции атрибут dispatch(), с его помощью можно узнать, какой функцией будет обработан конкретный тип (см. пример выше).
Синонимы поиска: functools.singledispatch, functools, singledispatch
На заметку
Зарегистрированные пользователи могут публиковать свои Статьи.