| 986 | |
| 987 | |
| 988 | class DependenciesMapping(MutableMapping): |
| 989 | def __init__(self, dsk): |
| 990 | self.dsk = dsk |
| 991 | self._removed = set() |
| 992 | # Set a copy of dsk to avoid dct resizing |
| 993 | self._cache = dsk.copy() |
| 994 | self._cache.clear() |
| 995 | |
| 996 | def __getitem__(self, key): |
| 997 | if (val := self._cache.get(key)) is not None: |
| 998 | return val |
| 999 | else: |
| 1000 | v = self.dsk[key] |
| 1001 | try: |
| 1002 | deps = v.dependencies |
| 1003 | except AttributeError: |
| 1004 | from dask.core import get_dependencies |
| 1005 | |
| 1006 | deps = get_dependencies(self.dsk, task=v) |
| 1007 | |
| 1008 | if self._removed: |
| 1009 | # deps is a frozenset but for good measure, let's not use -= since |
| 1010 | # that _may_ perform an inplace mutation |
| 1011 | deps = deps - self._removed |
| 1012 | self._cache[key] = deps |
| 1013 | return deps |
| 1014 | |
| 1015 | def __iter__(self): |
| 1016 | return iter(self.dsk) |
| 1017 | |
| 1018 | def __delitem__(self, key: Any) -> None: |
| 1019 | self._cache.clear() |
| 1020 | self._removed.add(key) |
| 1021 | |
| 1022 | def __setitem__(self, key: Any, value: Any) -> None: |
| 1023 | raise NotImplementedError |
| 1024 | |
| 1025 | def __len__(self) -> int: |
| 1026 | return len(self.dsk) |
| 1027 | |
| 1028 | |
| 1029 | class _DevNullMapping(MutableMapping): |
no outgoing calls