Dictionary dispatch, dispatch table – таблица диспетчеризации.
Техника программирования, позволяющая оптимизировать код и избавиться от множества конструкций if-elif-else.
Пример 1
# Даны три однотипные функции, принимающие одинаковые аргументы
def process_admin_request(user, request):
return f"Admin {user} processed: {request}"
def process_manager_request(user, request):
return f"Manager {user} processed: {request}"
def process_client_request(user, request):
return f"Client {user} processed: {request}"
# Таблица диспетчеризации: роли → функции
group_to_process_method = {
"admin": process_admin_request,
"manager": process_manager_request,
"client": process_client_request,
}
# Пример данных
class User:
def __init__(self, name, group):
self.name = name
self.group = group
user = User("Alice", "manager")
request = "update database"
# Вызов функции через таблицу диспетчеризации
result = group_to_process_method[user.group](user.name, request)
print(result)
### Вывод
# Manager Alice processed: update database
Пример 2 – применение в Data Science
Обеспечиваем выбор метода нормализации данных.
import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# "Фабрики" для скейлеров
def standard_scaler(data):
return StandardScaler().fit_transform(data)
def minmax_scaler(data):
return MinMaxScaler().fit_transform(data)
def robust_scaler(data):
return RobustScaler().fit_transform(data)
# Таблица диспетчеризации
scaler_methods = {
"standard": standard_scaler,
"minmax": minmax_scaler,
"robust": robust_scaler,
}
# Данные
X = np.array([[1, 100], [2, 300], [3, 500]], dtype=float)
# Допустим, пользователь выбирает метод "robust"
chosen_method = "standard"
# Автоматически применяем соответствующий метод
X_scaled = scaler_methods[chosen_method](X)
print("Исходные данные:\n", X)
print("После нормализации:", chosen_method, "\n", X_scaled)
Или выбор модели для обучения.
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
# Таблица диспетчеризации моделей
model_dispatch = {
"logreg": LogisticRegression,
"tree": DecisionTreeClassifier,
"svm": SVC,
}
# Допустим, выбрали метод "tree"
chosen_model = "tree"
# Создаем модель через диспетчеризацию
model = model_dispatch[chosen_model](max_depth=3)
print("Используемая модель:", model)