import luigi class Foo(luigi.Task): message = 'Foo' class RunOnceTask(luigi.Task): my_task = luigi.TaskParameter() _comp = False def complete(self): return RunOnceTask._comp def run(self): print('\n==> TASK:{}, TYPE:{}\n'.format( self.my_task, type(self.my_task))) RunOnceTask._comp = True # Task param passed as class name class A1(luigi.Task): """Works as expected.""" def requires(self): yield RunOnceTask(my_task=Foo) class A2(luigi.Task): """But then this fails... luigi.task_register.TaskClassNotFoundException""" def run(self): yield RunOnceTask(my_task=Foo) # Task class passed as string class B1(luigi.Task): """Task runs, but task parameter is parsed as a string, not task.""" def requires(self): yield RunOnceTask(my_task='Foo') class B2(luigi.Task): """Works. Task string converted to task class.""" def run(self): yield RunOnceTask(my_task='Foo') if __name__ == '__main__': luigi.run()