この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。
このエントリは『Luigi Advent Calendar 2016』3日目の内容となります。
今回はタスクパラメータを設定していきたいと思います。
先日2日目はVisualStudioCodeを用いてのデバッグ でした。
タスクに対して、抽出日時や抽出条件の制御等のパラメータを設定したいといったケースがあるのは容易に想像できることと思います。
タスクのパラメータとして値を作成することで、タスク実行時に値を設定することが可能です。
設定方法
前回のサンプルではフィボナッチ数列を1000まで計算するといったタスクを作成しました。
これをデフォルト1000までとし、それ以外の値をパラメータで指定できるようにします。
Luigiのタスクでパラメータを設定する際にはクラス変数として宣言をし、その値に対してluigi.Parameter() を代入することで、その変数はパラメータとして扱われます。 よって以下のようになります。
HelloWorld.py
import luigi
import FibonacciNumber
class HelloWorldTask(luigi.Task):
limit = luigi.IntParameter()
task_namespace = 'examples'
m = []
def run(self):
f = FibonacciNumber.FibonacciNumber()
ans = f.calculation(self.limit)
print list(ans)
このように設定したばあい、Luigiのタスクとして起動した際パラメータの入力を求められることになります。
パラメータを付与した場合、起動オプションに --help とつけて起動することで、付与するパラメータを確認することができます。
$ PYTHONPATH='.' luigi --module HelloWorld examples.HelloWorldTask --local-s cheduler --help
usage: luigi [--local-scheduler] [--module CORE_MODULE] [--help] [--help-all]
[--examples.HelloWorldTask-limit EXAMPLES.HELLOWORLDTASK_LIMIT]
[--limit LIMIT]
[Required root task]
positional arguments:
Required root task Task family to run. Is not optional.
optional arguments:
--local-scheduler Use an in-memory central scheduler. Useful for testing.
--module CORE_MODULE Used for dynamic loading of modules
--help Show most common flags and all task-specific flags
--help-all Show all command line flags
--examples.HelloWorldTask-limit EXAMPLES.HELLOWORLDTASK_LIMIT
--limit LIMIT
末尾2行をみると設定したパラメータ(limit)に対して値を設定できるようになっていることがわかります。
また、パラメータを設定しなかった場合以下のようになります。
$ PYTHONPATH='.' luigi --module HelloWorld examples.HelloWorldTask --local-s cheduler
ERROR: Uncaught exception in luigi
Traceback (most recent call last):
( 中略)
MissingParameterException: examples.HelloWorldTask[args=(), kwargs={}]: requi res the 'limit' parameter to be set
limitというパラメータがセットされてないといった例外が発生していることがわかります。
パラメータにデフォルト値を設定したい場合は以下のようにすることで設定することが可能です。
HelloWorld.py
import luigi
import FibonacciNumber
class HelloWorldTask(luigi.Task):
limit = luigi.IntParameter(default=1000)
task_namespace = 'examples'
m = []
def run(self):
f = FibonacciNumber.FibonacciNumber()
ans = f.calculation(self.limit)
print list(ans)
上記の用にすることでパラメータを付与しなくても、パラメータを付与した際と同じ動きをすることになります。
まとめ
タスクパラメータを設定することで、タスクを起動する際にその挙動を制御することができました。
明日はローカルファイルの参照を行います。