2017-07-17 64 views
0

我正在使用luigi在Python中,並試圖瞭解luigi參數如何在編譯時與運行時一起工作。luigi中的默認DateSecondParameter(python)

import luigi 
import datetime 

class HelloWorld(luigi.Task): 

    run_dt = luigi.DateSecondParameter(default = datetime.datetime.now()) 

    def requires(self): 
     return(None) 

    def output(self): 
     return(luigi.LocalTarget('helloworld.txt')) 

    def run(self): 
     with self.output().open('w') as outfile: 
      outfile.write('Hello World!\n') 

我用

datetime.datetime.now() 

在類定義的默認DateSecondParameter爲的HelloWorld()。我運行以下代碼:

a = HelloWorld() 
# wait a few seconds 
b = HelloWorld() 

a is b 
'True' 

當我將當前日期和時間作爲參數傳遞時,我得到了不同的結果。

x = HelloWorld(run_dt = datetime.datetime.now()) 
# wait a few seconds 
y = HelloWorld(run_dt = datetime.datetime.now()) 

x is y 
'False' 

是對

DateSecondParameter 

在編譯時設置的類定義的HelloWorld()的默認,而不是當我實例化類?我是否需要顯式傳遞當前的日期和時間作爲參數來實例化一個唯一的實例?

回答

1

是編譯時在HelloWorld()的類定義中設置的DateSecondParameter的默認值,而不是當我實例化類時?

由於Python被解釋,而不是編譯,所以談論Python的編譯時有點令人困惑。第一次引用類時,將計算類參數的默認值。

我是否需要顯式傳入當前日期和時間作爲參數來實例化唯一實例?

不,從通用python角度來看,類的每個實例(通常稱爲對象)都是唯一的。從luigi的角度來看,這些參數需要不同才能被認爲是不同的任務。在命令行運行luigi的普通方式中,worker的每次運行都將是一個單獨的python進程,因此您的代碼會很好。您的方法面臨的挑戰是如果您需要在不同的時間在同一個工作人員中運行許多HelloWorld實例。在這些情況下,需要HelloWorld任務的任務必須發送now值,因此每次運行requires()方法時都會計算該值。