这里我如何做到这一点(所有代码未经测试):
步骤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
也许你想指定一些其他的方式的步骤。例如,一个文本文件或一个字符串(听起来可能是基于Web的?)。然后,您需要在算法上进行注册。最简单的方法是创建一个名为“registry.py”的模块,如下所示:
algorithms = {}
很简单,是吗?你会注册一个新的算法,像这样:
from registry import algorithms
algorithms['dataset'] = Dataset
algorithms['multiplier'] = Multiplier
您还会需要创建从一个文本文件或东西规格链的方法。我会留给你的。 ;)
(我可能会使用Zope组件体系结构并制作算法组件,并将它们注册到组件注册表中,但这一切都严格来说是过度的)。
非常优雅。 – 2010-01-24 11:43:34
对不起,作为新手,但我不能让代码工作。我会从algo_by_name函数返回算法名称吗? – 2010-01-24 16:39:48
algo_by_name(aname)需要是一个函数,所以你可以传递(p,data)给它。我写了一个例子。 – Tobu 2010-01-24 17:15:55