入力引数argparse pythonのフォーマットを指定する


111

コマンドライン入力を必要とするpythonスクリプトがあり、それらを解析するためにargparseを使用しています。ドキュメントが少しわかりにくく、入力パラメータの形式を確認する方法が見つかりませんでした。形式をチェックすることで私が意味することは、このサンプルスクリプトで説明されています。

parser.add_argument('-s', "--startdate", help="The Start Date - format YYYY-MM-DD ", required=True)
parser.add_argument('-e', "--enddate", help="The End Date format YYYY-MM-DD (Inclusive)", required=True)
parser.add_argument('-a', "--accountid", type=int, help='Account ID for the account for which data is required (Default: 570)')
parser.add_argument('-o', "--outputpath", help='Directory where output needs to be stored (Default: ' + os.path.dirname(os.path.abspath(__file__)))

私はオプションをチェックする必要がある-s-e、ユーザによる入力が形式であることYYYY-MM-DD。argparseには、これを実現する方法がわからないオプションがありますか?

回答:


235

ドキュメントごと:

typeキーワード引数がadd_argument()必要な任意の型チェックと型変換を行うことができます... type=単一の文字列引数を取り、変換された値を返す任意の呼び出し可能を取ることができます

あなたは次のようなことをすることができます:

def valid_date(s):
    try:
        return datetime.strptime(s, "%Y-%m-%d")
    except ValueError:
        msg = "Not a valid date: '{0}'.".format(s)
        raise argparse.ArgumentTypeError(msg)

次にそれを次のように使用しますtype

parser.add_argument("-s", 
                    "--startdate", 
                    help="The Start Date - format YYYY-MM-DD", 
                    required=True, 
                    type=valid_date)

編集した他の質問について、そのドキュメント(ある場合)を教えていただけますか?
Sohaib 2014

valid_date()与えられた引数が文字列であると仮定?
Stevoisiak 2018

1
@StevenVascellaroはい、しかしそれがAPIが定義するものです。ドキュメントからの引用ごとに「単一の文字列引数を取ります」
jonrsharpe、2018

71

上記の答えに追加するだけで、ワンライナーにしたい場合はラムダ関数を使用できます。例えば:

parser.add_argument('--date', type=lambda d: datetime.strptime(d, '%Y%m%d'))

古いスレッドですが、質問は少なくとも私にはまだ関係がありました!


6
あなたが何かの無効を渡した場合、エラーメッセージがちょうどになりますが、これは、素敵なトリックですinvalid <lambda> value
ブラッド・ソロモン

38

検索エンジンを介してこれに当たった人のために:Python 3.7では、.fromisoformatISO-8601準拠の日付のホイールを再発明する代わりに、標準のクラスメソッドを使用できます。例:

parser.add_argument('-s', "--startdate",
    help="The Start Date - format YYYY-MM-DD",
    required=True,
    type=datetime.date.fromisoformat)
parser.add_argument('-e', "--enddate",
    help="The End Date format YYYY-MM-DD (Inclusive)",
    required=True,
    type=datetime.date.fromisoformat)

5
さらに、dateutil ISOパーサーは、まだISO 8601-2004に準拠しているいくつかの追加のfmtを取得します。import dateutil.parser-> type=dateutil.parser.isoparseまたはtype=dateutil.parser.parse
Brad Solomon

@BradSolomon確かに良い提案(つまり、私の+1)dateutilですが、サードパーティのパッケージです。それを追加でインストールする(小さな)煩わしさから、その利点を判断する必要があります。YMMV。
Laryx Decidua
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.