我正在使用Python中的luigi,并试图了解luigi参数在编译时与运行时的关系。
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()
作为HelloWorld()的类定义中的默认DateSecondParameter。我运行以下代码:
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()的类定义中的编译时设置,而不是在我实例化类时?我是否需要显式传递当前日期和时间作为参数来实例化一个唯一的实例?
答案 0 :(得分:1)
在HelloWorld()的类定义中是否在编译时设置了DateSecondParameter
的默认值,而不是在我实例化类时?
我是否需要显式传递当前日期和时间作为参数来实例化一个唯一的实例?
不,从通用python的角度来看,类的每个实例(通常称为对象)都是唯一的。从luigi的角度来看,参数需要不同,以便将其视为不同的任务。在命令行运行luigi的普通方式中,worker的每次运行都是一个单独的python进程,所以你的代码就可以了。您的方法面临的挑战是,您需要在不同时间运行同一工作程序中的许多HelloWorld
实例。在这些情况下,需要HelloWorld
任务的任务必须发送now值,因此每次运行requires()
方法时都会计算它。