Вы могли бы расширить сам класс list
и применять преобразования лениво по мере необходимости.Вот краткая реализация - она не позволяет манипулировать индексами для преобразований, но вы можете применить любое преобразование отображения в стеке.
class ListTransform(list):
def __init__(self, *args):
list.__init__(self, *args)
self.transforms = []
def __getitem__(self, index):
return reduce(lambda item, t: t(item), self.transforms, list.__getitem__(self, index))
def __iter__(self):
for index in xrange(len(self)):
yield self[index]
def __repr__(self):
return "'[%s]'" % ", ".join(repr(item) for item in self)
__str__ = lambda s: repr(s).strip("'")
И вы готовы к работе:
>>> a = ListTransform( range(10))
>>> a
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> a.transforms.append(lambda x: 2 * x)>>> a
'[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]'
>>> a.transforms.append(lambda x: x + 5)
>>> a
'[5, 7, 9, 11, 13, 15, 17, 19, 21, 23]'
>>> a.append(0)
>>> a
'[5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 5]'
Хорошо - возможно, я перехитрил вызов "Reduce" в методе getitem - но это забавная часть.:-) Не стесняйтесь переписать его в несколько строк для удобства чтения:
def __getitem__(self, index):
item = list.__getitem__(self, index)
for t in self.transforms:
item = t(item)
return item
Если вам понравилась идея, вы можете включить элемент «filter» для создания функций фильтрации для элементов и проверить количествопараметров в преобразованиях, чтобы они могли работать с индексами и даже достигать других элементов списка.