在Luigi docs中,建议使用luigi.Config
类进行全局配置。
但是,在使用这样的配置类时,我遇到了一些问题,以便将命令行参数传递给管道中的各种任务。
这是一个轻量级的例子:
import datetime
import luigi
class HelloWorldTask(luigi.Task):
def run(self):
print("{task} says: Hello world on {date}!".format(task=self.__class__.__name__,
date=GlobalParams.date.strftime('%d-%b-%Y')))
class GlobalParams(luigi.Config):
date = luigi.DateParameter(default=datetime.date.today())
if __name__ == '__main__':
luigi.run(['HelloWorldTask', '--workers', '1', '--local-scheduler',
'--GlobalParams-date', '2018-01-01'])
类GlobalParams
定义了DateParameter
,我希望稍后在管道任务的run()
块中引用它。但是,这失败了,
AttributeError: 'DateParameter' object has no attribute 'strftime'
。
在调试器中,我可以看到DateParameter
对象被传递给HelloWorldTask
任务,但是任何尝试提取在运行时传递的预期'2018-01-01'
值都会失败。
我是否误解了如何使用这些结构?我应该如何将单个参数传递给(可能很多)任务?
答案 0 :(得分:2)
示例代码中的问题是GlobalParams类在访问其参数之前未被实例化。
class Dc_Decidir_Block_Redirect extends Mage_Core_Block_Abstract
{
protected function _toHtml()
{
$form = new Varien_Data_Form();
$form->setAction(Mage::helper('decidir')->getPaymentGatewayUrl())
->setId('decidir_checkout')
->setName('decidir_form')
->setMethod('get')
->setUseContainer(true);
$decidir = Mage::getModel('decidir/decidir');
foreach ($decidir->getCheckoutFormFields() as $field => $value)
{
$form->addField($field, 'hidden', array('name' => $field, 'value' => $value));
Mage::helper('decidir')->log('Form Field: ' . $field);
Mage::helper('decidir')->log('Form Value: ' . $value);
}
$html = $this->__('Serás redirigido(a) al Botón de Pagos');
$html.= $form->toHtml();
$html.= '<script type="text/javascript">document.getElementById("decidir_checkout").submit();</script>';
return $html;
}
}
应该是GlobalParams.date.strftime('%d-%b-%Y')
。
在问题中链接的配置文档中包含但很容易忽略。