【问题标题】:Is subclassing a Luigi task possible?子类化 Luigi 任务是可能的吗?
【发布时间】:2017-05-27 21:44:43
【问题描述】:

我正在使用luigi 工作流库。我想继承它的luigi.Task 类来添加更多我自己的方法和参数。

通常的对象模式是:

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)

为什么会这样?

【问题讨论】:

  • 它可能也定义了__new__
  • 我在source 中没有看到它这样做。 (除非six.add_metaclass(Register) 装饰器这样做;不熟悉six,但我非常怀疑)
  • 这是实际的堆栈跟踪:i.fluffy.cc/sVJCJ9Xfz8tCtWmJvkmV0jWNhPjcTrxf.html 它在 Register.__call__ 内部崩溃(Register 是一个元类,添加了 six.add_metaclass
  • 是的,我仔细一看正要收回来。隐藏在兼容性库中的元编程......那么就不可能对元分类类进行子类化吗?

标签: python-3.x class subclass luigi


【解决方案1】:

这里的实际崩溃是由于 metaclass 在实例化时运行。

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

我相信你的例子会写成这样:

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

【讨论】:

  • 这是公平的。感谢您发现我错过的内容。
猜你喜欢
  • 2017-05-02
  • 2019-01-29
  • 1970-01-01
  • 2015-05-01
  • 2017-08-06
  • 1970-01-01
  • 2022-01-04
  • 2017-07-16
  • 2016-03-11
相关资源
最近更新 更多