clickでオプション引数として日付を扱ってみよう
clickモジュールを使うと、ユーザから入力された日時文字列のチェックなどを行ってくれるようになります。
次のコードは、コマンドラインでオプション--start と --end のオプション引数として与えた2つの日時の経過時間を表示するものです。
code: sample_click_datime.py
from datetime import date
import click
@click.command()
@click.option('-S', '--start', type=click.DateTime(formats="%Y-%m-%d"), default=str(date.today()),
help='Start date')
@click.option('-E', '--end', type=click.DateTime(formats="%Y-%m-%d"), default=str(date.today()),
help='End date')
def cmd(start, end):
click.echo(f"Start: {start}, End: {end} ")
date_difference = end - start
click.echo(f"Date Difference: {date_difference} ")
if __name__ == '__main__':
cmd()
この例では、ユーザが指定できる日時の書式が固定になっていますが、
click.DateTime() で formatsを指定しない場合は次の3つを受け付けるようになっています。
%Y-%m-%d
%Y-%m-%dT%H:%M:%S
%Y-%m-%d %H:%M:%S
独自の日付の書式を受け付けるようにするためには、次のように Dateクラスを定義して使用します。
code: sample_click_datetime2.py
from datetime import datetime
import click
class Date(click.ParamType):
name = 'date'
def __init__(self, formats=None):
self.formats = formats or [
'%Y/%m/%d',
'%Y/%m/%d %H:%M:%S'
]
def get_metavar(self, param):
return '{}'.format('|'.join(self.formats)) def _try_to_convert_date(self, value, format):
try:
return datetime.strptime(value, format).date()
except ValueError:
return None
def convert(self, value, param, ctx):
for format in self.formats:
date = self._try_to_convert_date(value, format)
if date:
return date
self.fail(
'invalid date format: {}. (choose from {})'.format(
value, ', '.join(self.formats)))
def __repr__(self):
return 'Date'
@click.command()
@click.option('-S', '--start', type=Date(),
default=str(datetime.today()),
help='Start datetime')
@click.option('-E', '--end', type=Date(),
default=str(datetime.today()),
help='End datetime')
def cmd(start, end):
msg=f"Start: {start}, End: {end} "
click.echo(msg)
if __name__ == '__main__':
cmd()