43 lines
1020 B
Python
43 lines
1020 B
Python
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)
|