split_namespace.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. """Split namespace for argparse to allow separating options by prefix.
  2. We use this to direct some options to an Options object and some to a
  3. regular namespace.
  4. """
  5. # In its own file largely because mypyc doesn't support its use of
  6. # __getattr__/__setattr__ and has some issues with __dict__
  7. from __future__ import annotations
  8. import argparse
  9. from typing import Any
  10. class SplitNamespace(argparse.Namespace):
  11. def __init__(self, standard_namespace: object, alt_namespace: object, alt_prefix: str) -> None:
  12. self.__dict__["_standard_namespace"] = standard_namespace
  13. self.__dict__["_alt_namespace"] = alt_namespace
  14. self.__dict__["_alt_prefix"] = alt_prefix
  15. def _get(self) -> tuple[Any, Any]:
  16. return (self._standard_namespace, self._alt_namespace)
  17. def __setattr__(self, name: str, value: Any) -> None:
  18. if name.startswith(self._alt_prefix):
  19. setattr(self._alt_namespace, name[len(self._alt_prefix) :], value)
  20. else:
  21. setattr(self._standard_namespace, name, value)
  22. def __getattr__(self, name: str) -> Any:
  23. if name.startswith(self._alt_prefix):
  24. return getattr(self._alt_namespace, name[len(self._alt_prefix) :])
  25. else:
  26. return getattr(self._standard_namespace, name)