| """Split namespace for argparse to allow separating options by prefix. |
| |
| We use this to direct some options to an Options object and some to a |
| regular namespace. |
| """ |
| |
| # In its own file largely because mypyc doesn't support its use of |
| # __getattr__/__setattr__ and has some issues with __dict__ |
| |
| from __future__ import annotations |
| |
| import argparse |
| from typing import Any |
| |
| |
| class SplitNamespace(argparse.Namespace): |
| def __init__(self, standard_namespace: object, alt_namespace: object, alt_prefix: str) -> None: |
| self.__dict__["_standard_namespace"] = standard_namespace |
| self.__dict__["_alt_namespace"] = alt_namespace |
| self.__dict__["_alt_prefix"] = alt_prefix |
| |
| def _get(self) -> tuple[Any, Any]: |
| return (self._standard_namespace, self._alt_namespace) |
| |
| def __setattr__(self, name: str, value: Any) -> None: |
| if name.startswith(self._alt_prefix): |
| setattr(self._alt_namespace, name[len(self._alt_prefix) :], value) |
| else: |
| setattr(self._standard_namespace, name, value) |
| |
| def __getattr__(self, name: str) -> Any: |
| if name.startswith(self._alt_prefix): |
| return getattr(self._alt_namespace, name[len(self._alt_prefix) :]) |
| else: |
| return getattr(self._standard_namespace, name) |