functools.singledispatch
Декоратор, превращающий функцию в универсальную функцию одиночной диспетчеризации.
functools.singledispatch(func)
-> callable
func -- Функция, к которой следует сделать универсальной.
Универсальная (generic) функция — функция, составленная из нескольких функций, реализующих одну и ту же операцию для различных типов. Нужная реализация при этом определяется алгоритмом диспетчеризации.
Одиночная (single) диспетчеризация — алгоритм диспетчеризации для универсальных функций, при котором нужная реализация выбирается на основе типа одного аргумента.
В примере ниже при помощи рассматриваемого декоратора определяем универсальную функцию — она будет использована, если для типа первого аргумента не найдётся более специфичной реализации (функция вызывается для объектов типа object).
.register()
Декоратор добавит вашей функции атрибут
+py3.7 Тип можно не передавать в декоратор, а указать непосредственно в определении функции при помощи аннотации:
.registry
Декоратор добавит вашей функции атрибут
.dispatch()
Декоратор добавит вашей функции атрибут
Одиночная (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
На заметку
В соответствующем разделе вы можете зарегистрировать сообщество по интересам, чтобы о нём узнали и другие посетители сайта — возможно, так вы отыщите новых единомышленников и друзей.. И не важно виртуальное оно, или вполне реальное, давно существующее, или только-только придуманное.