discover.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from __future__ import annotations
  2. from abc import ABC, abstractmethod
  3. class Discover(ABC):
  4. """Discover and provide the requested Python interpreter."""
  5. @classmethod
  6. def add_parser_arguments(cls, parser):
  7. """
  8. Add CLI arguments for this discovery mechanisms.
  9. :param parser: the CLI parser
  10. """
  11. raise NotImplementedError
  12. def __init__(self, options) -> None:
  13. """
  14. Create a new discovery mechanism.
  15. :param options: the parsed options as defined within :meth:`add_parser_arguments`
  16. """
  17. self._has_run = False
  18. self._interpreter = None
  19. self._env = options.env
  20. @abstractmethod
  21. def run(self):
  22. """
  23. Discovers an interpreter.
  24. :return: the interpreter ready to use for virtual environment creation
  25. """
  26. raise NotImplementedError
  27. @property
  28. def interpreter(self):
  29. """:return: the interpreter as returned by :meth:`run`, cached"""
  30. if self._has_run is False:
  31. self._interpreter = self.run()
  32. self._has_run = True
  33. return self._interpreter
  34. __all__ = [
  35. "Discover",
  36. ]