はじめに
pythonのオプション引数で、datetime.date型の値を受け取る方法の忘備録です。
やりたいこと
- オプション引数で日付を表す文字列(例:
2020-01-01
)を受け取り、datetime.date型に変換する。 - 不正な形式の文字列が渡された場合に、オリジナルのエラーメッセージを出す。
ArgumentParserでdatetimeの型指定をする
Argparseの基本的な使い方については 公式チュートリアル が参考になりました。
チュートリアルではint型の型指定をしていますが、今回指定したいのはdatetime.date型です。
日付を表す文字列(例:2020-01-01
)をdateオブジェクトに変換する関数date_type
を定義し、ArgumentParserのtypeに指定します。
import argparse
import datetime
# str -> date 型変換関数
def date_type(date_str):
return datetime.date.fromisoformat(date_str)
if __name__ == '__main__':
# ArgumentParserの取得
arg_parser = argparse.ArgumentParser()
# 日付指定オプションの定義
arg_parser.add_argument("-d", "--date",
help="Date must be in ISO format. For example: 2020-01-01.",
type=date_type)
# オプション引数の取得
args = arg_parser.parse_args()
date = args.date
print(date.year,date.month,date.day)
実行結果
>python test.py -d 2020-01-01
2020 1 1
エラーメッセージをカスタムする
上記のコードでは、オプション引数がISOフォーマットの日付以外の形式だった場合、以下のエラーが出力されます。
>python test.py -d hoge
usage: mtg.py [-h] [-d DATE]
mtg.py: error: argument -d/--date: invalid date_type value: 'hoge'
定義した関数名 date_type がエラーメッセージに入ってしまうのが気にくわないので、エラー内容をカスタムします。
先ほどの型変換関数date_type
を下記のように修正します。
def date_type(date_str):
try:
return datetime.date.fromisoformat(date_str)
except ValueError as e:
raise argparse.ArgumentTypeError(str(e) + " Date must be in ISO format. ex. 2020-01-01")
try-except で新しい例外を発生させています。
処理する例外の型(ValueError)は実際に発生させて確認しました。
>>> import datetime
>>> datetime.date.fromisoformat('hoge')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid isoformat string: 'hoge'
実行結果
>python test.py -d hoge
usage: test.py [-h] [-d DATE]
test.py: error: argument -d/--date: Invalid isoformat string: 'hoge' Date must be in ISO format. ex. 2020-01-01
おわりに
最初にpython argparser datetime
でググりましたが、重箱の隅すぎるのか日本語文献が出てこなかったので、記事にしてみました。
参考文献
Argparserの公式チュートリアル:Argparse チュートリアル — Python 3.8.2 ドキュメント
@kzkadc さんの記事も参考にさせていただきました
ArgumentParserの使い方を簡単にまとめた - Qiita
公式ドキュメント
argparse --- コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.8.2 ドキュメント