click概要Pythonでコマンドライン引数を扱う際に便利なclickについて、利用可能なTypeについてまとめる。3.7.3指定可能なタイプ下記のTypeが利用できる。stringintfloatboolclick.UUIDclick.Fileclick.Pathclick.Choiceclick.IntRangeclick.FloatRangeclick.DateTime独自拡張intintは整数のみ受け付ける。下記はintのコマンドライン引数ageを受け取るコード。optionでtype=intを指定している。disp()数字を渡した場合は正常に処理が実行される。1age=1requiredでなければNoneも許可される。この挙動はint以外の他のTypeでも同じ。Noneが渡されている。age=NoneIntに変換できない文字列やfloatは受け付けない。通る文字列であれば許可される。https://github.com/pallets/click/blob/7.0/click/types.py#L244floatfloatは数値のみ受け付ける。下記はscoreという名前でfloatの引数を受け取っている。disp()小数点を通す以外はintと同じ。https://github.com/pallets/click/blob/7.0/click/types.py#L296boolboolはTrue/Falseを受け取る。Trueとして扱われる値は下記(大文字小文字は無視)。truet1yesyFalseとして扱われる値は下記。disp()Yesを指定して実行。Yesflag=True「はい」を指定して実行する。booleanbooleanに変換する処理は下記あたりを参照。使う方が楽かもしれない。disp()引数が指定されていればTrue、されていなければFalseになる。ようにTrue用とFalse用双方の引数を用意する方法もある。click.echo('flg={}'.format(flg))--flgを指定すればTrue、--no-flgを指定すればFalseが返る。--no-flgflg=Falseclick.UUIDclick.UUIDは名前の通りUUIDを引数に取る。事前準備として引数に渡せるvalidなuuidを生成。print(uuid.uuid4())"uuidを引数に取るコード。disp()uuidを引数に渡して実行すると正常に通る。1b3b9c7c-71d8-4c6d-83bb-068055891f7duuid=1b3b9c7c-71d8-4c6d-83bb-068055891f7duuidの形式に合っているかチェックが行われているので、例えば末尾の1文字を削って実行すると形式が合ってないぞとエラーになる。通る文字列である必要がある。事前に適当なファイルを作っておく。temp.txt引数で指定されたパスのファイルを読んで標準出力するコード。disp()これでファイルの中身が取れる。file=foobar存在しないパスの場合はエラーになる。directorymodeにwを指定して指定ファイルに出力してみる。disp()hoge.txtに出力。atomic(write時にtemporaryに書いて終わったらmvする)などが指定できる。https://github.com/pallets/click/blob/7.0/click/types.py#L406click.Pathclick.Pathはファイルやディレクトリのパスを指定する。下記はexists=Trueを指定して存在チェックも行っている。disp()存在するパスを引数に入れれば通る。path=temp.txt存在しないパスを入れるとチェックに引っかかる。dir_okayという引数が用意されている。しておくと、指定パスがディレクトリであればエラーになる。disp()ディレクトリを生成してそのパスを指定すると、dir_okay=Falseなのでエラーになる。directory.resolve_pathを指定すると事前にos.path.realpathでsymlink等を展開してくれる。symlinkを貼って準備。root_tempresolve_path=Trueに設定。それからfile_okay=Falseも指定しておく必要がある。disp()resolve_path周りの条件はここらへん。https://github.com/pallets/click/blob/7.0/click/types.py#L523その他、readable/writeableという引数で読込み/書込みが可能かチェックする引数も用意されている。click.Choiceclick.Choiceは指定された値の中から選択する。下記はAかBのいずれかを選択する例。disp()Aを選択。Achoice=A引数に指定した以外の値を引数に入れるとエラー。B)Choiceの引数はStringを期待されていて、Intを指定すると下記のようなエラーになる。指定すると大文字小文字どちらでも通るようになる。click.echo('choice={}'.format(choice))click.IntRangeclick.IntRangeは範囲指定付きのInt。下記は0〜120を許可する例。disp()130を指定すると範囲外なのでエラる。120.clamp=Trueを指定すると、範囲外の場合は許容される上限or下限の値に変換される。click.echo('age={}'.format(age))clamp=Trueで引数130を渡した例。エラーにならずに120に変換される。130age=120下限以下の値であれば下限に変換される。-5age=0click.FloatRangeFlaotRangeはIntRangeのfloat版。disp()動作はIntRangeと同じ。clampも指定できる。click.DateTimeclick.DateTimeは日付指定。デフォルトでは下記の3つのフォーマットを想定して順にパースを試す。disp()フォーマットに合う形式で引数を送るとdatetime.datetime型で引数に渡される。00:00:00フォーマットが合わないとエラー。%H:%M:%S)引数に日付フォーマットを渡せば、指定した型でパースしてくれる。フォーマットは複数渡せる。click.echo('date={}'.format(date))typeをtupleで複数指定typeは複数指定することができる。下記はstringとintの2つを引数に取る指定。disp()引数を2つ指定するとtupleで渡される。3)1つしか渡さないとエラーになる。arguments引数を指定しない場合、Noneが渡るのではなくエラーになる。click.echo('items={}'.format(items))実行時はこんな感じ。'b')独自拡張Typeclick.ParamTypeを継承して独自にTypeを生成できる。いうクラスを作ってみる。コンストラクタで正規表現のパターンを取って、convertで正規表現にマッチすればvalueをそのままreturnし、マッチしなければfailを実行している。(self.pattern)作成したRegexParamを使って引数を指定する例。0-9の文字のみ許可するパターンを指定している。数値を入力すると正常に実行される。100num=100数値以外を入力するとエラー。'CsvParam()'使いそうな形式はいろいろ考えられる。MLFlowの機能をざっと試す第二弾。(1)リンク株式会社iMindスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。