2017-05-27 115 views
0

我正在使用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') –

回答

3

這裏的實際崩潰是由於在實例化上運行了一個metaclass

從閱讀luigi docs看來你應該爲你的類定義參數作爲類屬性(luigi.Parameter),並讓它們的元類機器負責構造函數。

我相信你的榜樣將寫成這樣:

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

這很公平。感謝您發現我錯過的內容。 –

相關問題