在Luigi中,我有一个任务要根据另一个上游任务的输出动态生成依赖项列表。例如:
class TaskA:
param = IntParameter()
class TaskB:
def main(self):
pass
def output(self):
return [1,2,3,4]
class TaskC:
def requires(self):
return [TaskB()] + [TaskA(param=p) for p in TaskB().output()]
总而言之,我将根据TaskB的输出在TaskC中创建一组TaskA依赖项。
我尝试了一些事情,但是Luigi似乎很困惑,因为TaskB确实需要在TaskC返回其依赖项列表之前运行。但是很明显,路易吉在调用TaskC.requires()
有什么办法可以使这项工作完成我在这里想要做的事情吗?
在我的现实生活中,这些任务的实现要复杂得多,但这是任务之间如何连接的要旨。
答案 0 :(得分:1)
这是一个很好的问题! Luigi实际上为此提供了完美的解决方案,并且在文档中对此进行了介绍:https://luigi.readthedocs.io/en/stable/tasks.html#dynamic-dependencies
基本上,根据输出,您将需要TaskB
,然后yield
在run
函数中的新任务上。让我向您展示一个示例:
class TaskC:
def requires(self):
return TaskB()
def run(self):
yield [TaskA(param=p) for p in self.input()]