10
5

More than 3 years have passed since last update.

ArgumentParserで日付型(datetime)を受け取る【python】

Posted at

はじめに

pythonのオプション引数で、datetime.date型の値を受け取る方法の忘備録です。

やりたいこと

  • オプション引数で日付を表す文字列(例:2020-01-01)を受け取り、datetime.date型に変換する。
  • 不正な形式の文字列が渡された場合に、オリジナルのエラーメッセージを出す。

ArgumentParserでdatetimeの型指定をする

Argparseの基本的な使い方については 公式チュートリアル が参考になりました。
チュートリアルではint型の型指定をしていますが、今回指定したいのはdatetime.date型です。

日付を表す文字列(例:2020-01-01)をdateオブジェクトに変換する関数date_typeを定義し、ArgumentParserのtypeに指定します。

test.py
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 さんの記事も参考にさせていただきました :bow:
ArgumentParserの使い方を簡単にまとめた - Qiita

公式ドキュメント
argparse --- コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.8.2 ドキュメント

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5