mod_opt.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """
  2. Модуль предосталвыяет тип Option (как в rust)
  3. """
  4. from collections.abc import Callable
  5. from typing import Generic, TypeVar
  6. # Параметры типов
  7. T = TypeVar("T")
  8. class Option(Generic[T]):
  9. """
  10. Тип контролирующий возвращаемое значение (возможно None).
  11. """
  12. def __init__(self, val: T | None = None) -> None:
  13. self._value: T | None = val
  14. """Хранимое значение."""
  15. def some(self) -> T:
  16. """Возвращает полезное значение, если оно есть"""
  17. if self._value is None:
  18. raise ValueError("Option[T].some(): val is None")
  19. return self._value
  20. def is_some(self) -> bool:
  21. """Проверка значения на значение"""
  22. return self._value is not None
  23. def is_none(self) -> bool:
  24. """Проверка значения на пустышку"""
  25. return self._value is None
  26. def unwrap_or(self, val_def: T) -> T:
  27. """Возвращает хранимое значение или альтернативу"""
  28. if self._value is not None:
  29. return self._value
  30. return val_def
  31. def unwrap_or_fn(self, fn: Callable[..., T]) -> T:
  32. """Возвращает значение или результат функции"""
  33. if self._value is not None:
  34. return self._value
  35. return fn()