是否可以继承Luigi任务?

问题描述:

我正在使用luigi工作流程库。我想继承luigi.Task类来添加更多我自己的方法和参数。是否可以继承Luigi任务?

通常的对象模式将是:

class MockClassA(): 
    pass 

class MockClassB(): 
    def __init__(self, foo): 
     super().__init__() 
     self.foo = foo 

>>> MockClassB(12).foo 
<<< 12 

然而,当我这样做:

class Transform(luigi.Task): 
    def __init__(self, foo): 
     super().__init__() 
     self.foo = foo 

我得到:

>>> Transform(12) 
<<< [...] UnknownParameterException: Transform[args=(12,), kwargs={}]: takes at most 0 parameters (1 given) 

为什么会发生这种情况?

+0

它可能定义'__new__'以及 –

+0

我没有看到它在[来源]这样做(https://开头github上。 COM/Spotify的/路易/斑点/主/路易/ task.py#L149)。 (除非'six.add_metaclass(Register)'装饰器这样做;不熟悉'six',但我非常怀疑它) –

+1

下面是实际的堆栈跟踪:https://i.fluffy.cc/sVJCJ9Xfz8tCtWmJvkmV0jWNhPjcTrxf.html它崩溃了'Register .__ call__'('Register'是一个元类,添加了'six.add_metaclass') –

这里的实际崩溃是由于在实例化上运行了一个metaclass

从阅读luigi docs看来你应该为你的类定义参数作为类属性(luigi.Parameter),并让它们的元类机器负责构造函数。

我相信你的榜样将写成这样:

class Transform(luigi.Task): 
    foo = luigi.Parameter() 
+0

这很公平。感谢您发现我错过的内容。 –