123456789101112131415161718192021222324252627282930313233343536373839404142 |
- from collections import UserDict, UserList
- __all__ = ["LazyDict", "LazyList"]
- class LazyDict(UserDict):
- def __init__(self, data):
- super().__init__()
- self.data = data
- def __getitem__(self, k):
- v = self.data[k]
- if callable(v):
- v = v(k)
- self.data[k] = v
- return v
- class LazyList(UserList):
- def __getitem__(self, k):
- if isinstance(k, slice):
- indices = range(*k.indices(len(self)))
- return [self[i] for i in indices]
- v = self.data[k]
- if callable(v):
- v = v(k)
- self.data[k] = v
- return v
- def __add__(self, other):
- if isinstance(other, LazyList):
- other = list(other)
- elif isinstance(other, list):
- pass
- else:
- return NotImplemented
- return list(self) + other
- def __radd__(self, other):
- if not isinstance(other, list):
- return NotImplemented
- return other + list(self)
|