901просмотров
8 декабря 2025 г.
Score: 991
from dataclasses import dataclass
from typing import Any, Hashable class Collection[T]: def init(self, entities: list[T]): self._entities = entities self._indexes = {} self._group_indexes = {} def fields(self, field_name: str) -> list[Any]: return [getattr(item, field_name) for item in self._entities] def by(self, field_name: str) -> dict[Hashable, T]: if field_name in self._indexes: return self._indexes[field_name] _map = {} for item in self._entities: _map.update({getattr(item, field_name): item}) self._indexes[field_name] = _map return _map def group_by(self, field_name: str) -> dict[Hashable, list[T]]: if field_name in self._group_indexes: return self._indexes[field_name] _map = {} for item in self._entities: value = getattr(item, field_name) if value in _map: _map[value].append(item) else: _map[value] = [item] self._indexes[field_name] = _map return _map @dataclass
class UserEntity: oid: int name: str email: str user_collection = CollectionUserEntity, UserEntity(oid=1, name="Jon", email="some1@some.com"), UserEntity(oid=1, name="Lerok", email="some2@some.com"), UserEntity(oid=1, name="Ivan", email="some3@some.com"), ]
) print(user_collection.by("email").get("some@some.com"))
print(user_collection.group_by("name").get("Ivan")) Концепт на вечерние размышления. Немного не так как я хотел. Но это набросочный вариант. Собрать обратную связь. Зачем это нужно?
В services возвращать не голые list, а обернутые collections, что бы можно было не городить словари или подобную порнографию для решения всяких релейшен проблем при сборке сложных DTO Типа есть Заказ. Есть юзера. Получили юзеров по списку id из заказов. намапили. (Да join использовать нельзя. например в разных сервисах)