【问题标题】:Creating luigi parameters from other parameters at initialization在初始化时从其他参数创建 luigi 参数
【发布时间】:2018-05-18 20:34:35
【问题描述】:

我有以下问题 - 我可以使用一个参数的值来定义另一个参数吗?这是我正在尝试做的一个说明。 假设我有一个如下所示的配置文件:

[MyTaskRunner]
logdir=/tmp/logs
numruns=2

我这样定义MyTaskRunner

class MyTaskRunner(luigi.Task):
      logdir=luigi.Parameter(default=None)
      rundate=luigi.Parameter(default=today)

其中logdir是从配置文件中获取的参数,rundate是运行时传入的参数。

现在,假设我希望像这样定义一个新变量logpath_str

       logpath_str="{}/{}".format(logdir, rundate)

是否可以将其定义为参数?

解决方案是指定默认值,如下所示:

       logpath=luigi.Parameter(default=logpath_str)

欢迎提出任何建议。

【问题讨论】:

    标签: python luigi


    【解决方案1】:

    在类初始化之前(__init__ 期间)参数值不会被解析,因此实现您正在寻找的行为的简单方法是实现 __init__ yourslef 并在之后使用默认值初始化 logpath调用超级。

    class MyTaskRunner(luigi.Task):
        logdir=luigi.Parameter(default=None)
        logpath=luigi.Parameter(default=None)
        rundate=luigi.Parameter(default=today)
    
        def __init__(self, *args, **kwargs):
            super(MyTaskRunner, self).__init__(*args, **kwargs)
    
            if self.logpath is None:
                self.logpath = "{}/{}".format(self.logdir, self.rundate)
    

    【讨论】:

      【解决方案2】:

      另一种可能性是为此使用 property 装饰器。

      class MyTaskRunner(luigi.Task):
            logdir=luigi.Parameter(default=None)
            rundate=luigi.Parameter(default=today)
      
            @property
            def logpath_str():
                return "{}/{}".format(self.logdir, self.rundate)
      

      当属性被调用时,对象已经被实例化并且两个必要的变量被初始化并且因此可以被正确调用。

      与重写构造函数相比,您节省了一些不必要的代码行。而且,我个人认为意图更明确。

      但是,这仅适用于您的参数(此处为 logpath_str)必须是只读的。只要参数必须是可写的,您就必须覆盖__init__。因此,在这种情况下,使用Michael C 的解决方案可能会更好。

      为了完整起见,使用 setter 的解决方案如下所示:

      class MyTaskRunner(luigi.Task):
          logdir=luigi.Parameter(default=None)
          rundate=luigi.Parameter(default=today)
      
          def __init__(self, *args, **kwargs):
              super().__init__(*args, **kwargs)
      
              # Set the default here
              self._logpath_str = "{}/{}".format(self.logdir, self.rundate)
      
          @property
          def logpath_str():
              return self._logpath_str
      
          @logpath_str.setter
          def logpath_str(value):
              self._logpath_str = value
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 2022-07-21
        相关资源
        最近更新 更多