| 16 | |
| 17 | |
| 18 | class Environ(MutableMapping[str, str]): |
| 19 | def __init__(self, environ: MutableMapping[str, str] = os.environ): |
| 20 | self._environ = environ |
| 21 | self._has_been_read: set[str] = set() |
| 22 | |
| 23 | def __getitem__(self, key: str) -> str: |
| 24 | self._has_been_read.add(key) |
| 25 | return self._environ.__getitem__(key) |
| 26 | |
| 27 | def __setitem__(self, key: str, value: str) -> None: |
| 28 | if key in self._has_been_read: |
| 29 | raise EnvironError(f"Attempting to set environ['{key}'], but the value has already been read.") |
| 30 | self._environ.__setitem__(key, value) |
| 31 | |
| 32 | def __delitem__(self, key: str) -> None: |
| 33 | if key in self._has_been_read: |
| 34 | raise EnvironError(f"Attempting to delete environ['{key}'], but the value has already been read.") |
| 35 | self._environ.__delitem__(key) |
| 36 | |
| 37 | def __iter__(self) -> Iterator[str]: |
| 38 | return iter(self._environ) |
| 39 | |
| 40 | def __len__(self) -> int: |
| 41 | return len(self._environ) |
| 42 | |
| 43 | |
| 44 | environ = Environ() |
no outgoing calls