Реализуйте класс
MiniRouter, который позволяет регистрировать и вызывать обработчики HTTP-путей с динамическими параметрами. Поддерживаемые шаблоны маршрутов:•
/users/:id — параметр id•
/posts/:post_id/comments/:comment_id — вложенные параметрыМетод
add_route(path_template, handler) регистрирует обработчик. Метод resolve(path) вызывает нужный обработчик и передаёт ему параметры в виде словаря.Если путь не совпадает ни с одним шаблоном — выбрасывается
ValueError.Решение задачи🔽
class MiniRouter:
def __init__(self):
self.routes = []
def add_route(self, path_template, handler):
parts = path_template.strip('/').split('/')
self.routes.append((parts, handler))
def resolve(self, path):
path_parts = path.strip('/').split('/')
for route_parts, handler in self.routes:
if len(route_parts) != len(path_parts):
continue
params = {}
matched = True
for route_part, path_part in zip(route_parts, path_parts):
if route_part.startswith(':'):
params[route_part[1:]] = path_part
elif route_part != path_part:
matched = False
break
if matched:
return handler(params)
raise ValueError("No route matched")
# Пример использования:
router = MiniRouter()
def user_handler(params):
return f"User ID: {params['id']}"
def comment_handler(params):
return f"Post {params['post_id']}, Comment {params['comment_id']}"
router.add_route('/users/:id', user_handler)
router.add_route('/posts/:post_id/comments/:comment_id', comment_handler)
print(router.resolve('/users/42')) # ➜ User ID: 42
print(router.resolve('/posts/100/comments/55')) # ➜ Post 100, Comment 55