我有一条管道:F-> M->S。其中F,M和S是任务。我将Luigi称为任务S。和M需要F。但是有时候,M需要D,其他时候需要B。F,D和B是不同的,没什么不同,但是M可以使用所有这些任务的输出。今天我们有了3个选择,但是随着时间的推移这个数字会增加。每次将新任务作为选项添加到管道时,我是否都应该更改所有任务(例如,我们现在有任务E的代码,有时M会要求它,而其他时候则不需要),或者可以我将任务作为参数传递(如何?)?
答案 0 :(得分:0)
您想要的可能是luigi中的Dynamic Dependency。我会有这样的东西
class M(luigi.Task):
def requires(self):
# keep empty() or add any dependency which are not dynamically required
def run(self):
# Collect condition for each of the dynamic dependencies
if(condition_for_task_F):
s=yield TaskF()
elif....
else:
s= yield TaskE()
并回答您的问题,是否可以将Task作为参数传递。 this可能是答案。但这绝对是禁止的,因为它违反了幂等原则。这是不好的编程。更好的方法是将依赖逻辑与这样的另一个任务分离。
F,D,B,E -> Y -> M -> S
其中Y只是计算依赖关系并将其推入M。