是否可以子类化 Luigi 任务?

Is subclassing a Luigi task possible?

我正在使用 luigi 工作流库。我想subclass its luigi.Task class 添加几个我自己的方法和参数。

通常的对象模式是:

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 看来,您应该将 class 的参数定义为 class 属性 (luigi.Parameter) 并让它们的元 class 机器负责构造函数。

我相信你的例子应该是这样写的:

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