Существует целый ряд подходов к конвейерам в Python, от полстраницы до ...
Вот основная идея: наверху поместите все определения шагов в dict;
, затем конвейер(например, «CAT») выполняет шаги C, A, T.
class Pipelinesimple:
"""p = Pipelinesimple( funcdict ); p.run( "C A T" ) = C(X) | A | T
funcdict = dict( A = Afunc, B = Bfunc ... Z = Zfunc )
pipeline = Pipelinesimple( funcdict )
cat = pipeline.run( "C A T", X ) # C(X) | A | T, i.e. T( A( C(X) ))
dog = pipeline.run( "D O G", X, **kw ) # D(X, **kw) | O(**kw) | G(**kw)
"""
def __init__( self, funcdict ):
self.funcdict = funcdict # funcs or functors of X
def run( self, steps, X, **commonargs ):
""" steps "C A T" or ["C", "A", "T"]
all funcs( X, **commonargs )
"""
if isinstance( steps, basestring ):
steps = steps.split() # "C A T" -> ["C", "A", "T"]
for step in steps:
func = self.funcdict(step)
# if X is None: ...
X = func( X, **commonargs )
return X
Далее, есть несколько способов присвоения различных параметров различным шагам.
Один из способов - это анализмногострочная строка, такая как
""" C ca=5 cb=6 ...
A aa=1 ...
T ...
"""
Другая - взять список функций / имен функций / параметров, например,
pipeline.run( ["C", dict(ca=5, cb=6), lambda ..., "T", dict(ta=3) ])
Третий - разделить параметры "A__aa B__ba ... "путь sklearn.pipeline.Pipeline .делает.(Это предназначено для машинного обучения, но вы можете копировать части конвейера.)
У каждого из них есть довольно четкие плюсы и минусы.
Может прийти большое сообщество талантливых людей.с десятком прототипов решения проблемы [конвейеров] очень быстро.
Но сокращение дюжины до двух или трех занимает вечность.
Какой бы способ вы ни выбрали, предоставьте способ регистрации все параметры для прогона.
См. также:
FilterPype
nipype