コンテンツにスキップ

日付時刻

Pythonのdatetimeとして、_CLIパラメータ_を指定できます。

関数は標準のPython datetimeオブジェクトを受け取り、再び、エディターは補完などを提供します。

from datetime import datetime

import typer


def main(birth: datetime):
    print(f"Interesting day to be born: {birth}")
    print(f"Birth hour: {birth.hour}")


if __name__ == "__main__":
    typer.run(main)

Typerは次の形式の文字列を受け入れます

  • %Y-%m-%d
  • %Y-%m-%dT%H:%M:%S
  • %Y-%m-%d %H:%M:%S

確認してください

$ python main.py --help

Usage: main.py [OPTIONS] BIRTH:[%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d %H:%M:%S]

Arguments:
  BIRTH:[%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d %H:%M:%S][required]

Options:
  --help                Show this message and exit.

// Pass a datetime
$ python main.py 1956-01-31T10:00:00

Interesting day to be born: 1956-01-31 10:00:00
Birth hour: 10

// An invalid date
$ python main.py july-19-1989

Usage: main.py [OPTIONS] [%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d%H:%M:%S]

Error: Invalid value for 'BIRTH:[%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d %H:%M:%S]': 'july-19-1989' does not match the formats '%Y-%m-%d', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%d %H:%M:%S'.

カスタム日付フォーマット

formatsパラメータを使用して、datetimeで受け取る形式をカスタマイズすることもできます。

formatsは、datetime.strptime()に渡される日付形式の文字列リストを受け取ります。

たとえば、ISO形式の日付時刻を受け入れたいが、何らかの奇妙な理由で、

  • 最初に月、
  • 次に日、
  • 次に年、
  • を "/" で区切った形式も受け入れたいとします。

...これは突飛な例ですが、その奇妙な形式も必要だとしましょう。

from datetime import datetime

import typer
from typing_extensions import Annotated


def main(
    launch_date: Annotated[
        datetime,
        typer.Argument(
            formats=["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", "%m/%d/%Y"]
        ),
    ],
):
    print(f"Launch will be at: {launch_date}")


if __name__ == "__main__":
    typer.run(main)

ヒント

可能な場合は、注釈付きバージョンを使用することをお勧めします。

from datetime import datetime

import typer


def main(
    launch_date: datetime = typer.Argument(
        ..., formats=["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", "%m/%d/%Y"]
    ),
):
    print(f"Launch will be at: {launch_date}")


if __name__ == "__main__":
    typer.run(main)

ヒント

formatsの最後の文字列"%m/%d/%Y"に注目してください。

確認してください

// ISO dates work
$ python main.py 1969-10-29

Launch will be at: 1969-10-29 00:00:00

// But the strange custom format also works
$ python main.py 10/29/1969

Launch will be at: 1969-10-29 00:00:00