是否可以继承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)
为什么会发生这种情况?
答
这里的实际崩溃是由于在实例化上运行了一个metaclass。
从阅读luigi docs看来你应该为你的类定义参数作为类属性(luigi.Parameter
),并让它们的元类机器负责构造函数。
我相信你的榜样将写成这样:
class Transform(luigi.Task):
foo = luigi.Parameter()
+0
这很公平。感谢您发现我错过的内容。 –
它可能定义'__new__'以及 –
我没有看到它在[来源]这样做(https://开头github上。 COM/Spotify的/路易/斑点/主/路易/ task.py#L149)。 (除非'six.add_metaclass(Register)'装饰器这样做;不熟悉'six',但我非常怀疑它) –
下面是实际的堆栈跟踪:https://i.fluffy.cc/sVJCJ9Xfz8tCtWmJvkmV0jWNhPjcTrxf.html它崩溃了'Register .__ call__'('Register'是一个元类,添加了'six.add_metaclass') –