Вот как я бы это сделал (весь код не проверен):
Шаг 1: Вам необходимо создать алгоритмы. Набор данных может выглядеть следующим образом:
class Dataset(object):
def __init__(self, dataset):
self.dataset = dataset
def __iter__(self):
for x in self.dataset:
yield x
Обратите внимание, что вы делаете из него итератор, поэтому вы выполняете итерацию по одному элементу за раз. Есть причина для этого, вы увидите позже:
Другой алгоритм может выглядеть так:
class Multiplier(object):
def __init__(self, previous, multiplier):
self.previous = previous
self.multiplier = multiplier
def __iter__(self):
for x in previous:
yield x * self.multiplier
Шаг 2
Ваш пользователь должен будет как-то составить цепочку из этого. Теперь, если у него был доступ к Python напрямую, вы можете просто сделать это:
dataset = Dataset(range(100))
multiplier = Multiplier(dataset, 5)
и затем получите результаты по:
for x in multiplier:
print x
И он будет запрашивать множитель для одного фрагмента данных за раз, а множитель, в свою очередь, будет представлять собой набор данных. Если у вас есть цепочка, это означает, что за один раз обрабатывается один фрагмент данных. Это означает, что вы можете обрабатывать большие объемы данных без использования большого количества памяти.
Шаг 3
Возможно, вы хотите указать шаги другим способом. Например, текстовый файл или строка (звучит так, как будто это может быть в Интернете?). Тогда вам нужен реестр по алгоритмам. Самый простой способ - просто создать модуль с именем «registry.py», например так:
algorithms = {}
Полегче, а? Вы бы зарегистрировали новый алгоритм так:
from registry import algorithms
algorithms['dataset'] = Dataset
algorithms['multiplier'] = Multiplier
Вам также понадобится метод, который создает цепочку из спецификаций в текстовом файле или что-то в этом роде. Я оставлю это на ваше усмотрение. ;)
(Я бы, вероятно, использовал архитектуру компонентов Zope, создавал компоненты алгоритмов и регистрировал их в реестре компонентов. Но это, строго говоря, перебор).