你如何将多个参数传递给Luigi子任务?

时间:2016-08-24 12:13:41

标签: python luigi

我有一个requires子任务的Luigi任务。子任务取决于父任务(即执行require ing的任务)传递的参数。我知道您可以通过设置...

来指定子任务可以使用的参数
def requires(self):
    return subTask(some_parameter)

...然后在子任务上,通过设置...

接收参数
x = luigi.Parameter()

这只会让你通过一个参数。通过任意数量的参数发送什么是最好的方式,我想要什么类型?我真的想要这样的东西:

class parentTask(luigi.Task):

    def requires(self):
        return subTask({'file_postfix': 'foo',
                        'file_content': 'bar'
        })

    def run(self):
        return


class subTask(luigi.Task):
    params = luigi.DictParameter()

    def output(self):
        return luigi.LocalTarget("file_{}.csv".format(self.params['file_postfix']))

    def run(self):
        with self.output().open('w') as f:
            f.write(self.params['file_content'])

正如您所看到的,我尝试使用luigi.DictParameter代替直线luigi.Parameter,但是当我运行上面的内容时,我从路易吉内部的某个地方得到TypeError: unhashable type: 'dict'

运行Python 2.7.11,Luigi 2.1.1

3 个答案:

答案 0 :(得分:3)

  

发送任意数量的最佳方式是什么?   参数,我想要的任何类型?

最好的方法是使用命名参数,例如,

#in requires
return MySampleSubTask(x=local_x, y=local_y)

class MySampleSubTask(luigi.Task):
    x = luigi.Parameter()
    y = luigi.Parameter()

答案 1 :(得分:0)

好的,所以我发现这在python 3.5中按预期工作(问题仍然存在于3.4中)。

没有时间深入了解今天,所以没有进一步的细节。

答案 2 :(得分:0)

  

发送任意数量的最佳方式是什么?   参数,我想要的任何类型?

你可以按照这个例子。你将有一个占位符来定义传递所需的所有参数(ParameterCollector)。如果在许多子任务的情况下需要将参数传递给子任务,这将避免在每个sincgle任务上定义参数。

class ParameterCollector(object):
    param1 = luigi.Parameter()
    param2 = luigi.Parameter()

    def collect_params(self):
        return {'param1': self.param1, 'param2': self.param2}


class TaskB(ParameterCollector, luigi.Task):
    def requires(self):
        return []

    def output(self):
        return luigi.LocalTarget('/tmp/task1_success')

    def run(self):
        with self.output().open('w') as f:
            f.write(self.param1)


class TaskA(ParameterCollector, luigi.Task):
    def requires(self):
        a = TaskB(**self.collect_params())
        print(a)
        return a

    def output(self):
        return luigi.LocalTarget('/tmp/task2_success')

    def run(self):
        with self.output().open('w') as f:
            f.write(str([self.param1, self.param2]))


if __name__ == '__main__':
    luigi.run()