我有一个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
答案 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()