是否可以子类化 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()
我正在使用 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()