OS | Windows 10 64bit |
Python | 3.10.2 |
Click | 8.1.3 |
clickは、シンプルでありながら高機能なオプション解析ライブラリです。
clickのインストールと基本的な使い方は以下の記事をご覧ください。
clickのtypeはオプションの引数に対して、どのようなtypeを持つかを指定できます。パース結果に対してもそのtypeに変換されて格納されます。
本記事ではclickのオプションのtype指定についてご紹介します。なお、本記事ではオプションのみご紹介します。
clickのtype指定は@click.option()
の引数typeに型を指定します。
以下の例は、文字列を指定しています。
import click
@click.command()
@click.option('-opt', '--option', type=click.STRING)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
typeに型を指定すると、オプションに渡されたオプション引数は、指定されたtypeに変換されて格納されます。
> python test.py -opt 18
option='18', type(option)=<class 'str'>
clickでは、多くの型が用意されています。以下に一覧として載せます。
type | 説明 |
---|---|
click.STRING | 文字列型 デフォルト |
click.INT | 整数型 |
click.FLOAT | 浮動小数点数型 |
click.BOOL | ブール型 |
click.UUID | UUID型 UUIDの形式に変換 |
click.UNPROCESSED | 強制的な型変換をさせない型 |
click.File | File型 ファイルとして変換 |
click.Path | Path型 ファイルパス名として変換 |
click.Choice | 選択肢型 |
click.IntRange | 整数範囲型 |
click.FloatRange | 浮動小数点数範囲型 |
click.DateTime | DateTime型 |
click.Tuple | Tuple型 |
click.ParamType | ParamType型 独自のtypeを作成する際に使用 |
文字列型に変換します。デフォルトのオプション引数変換です。
import click
@click.command()
@click.option('-opt', '--option', type=click.STRING)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 18
option='18', type(option)=<class 'str'>
整数型に変換します。
import click
@click.command()
@click.option('-opt', '--option', type=click.INT)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 18
option=18, type(option)=<class 'int'>
浮動小数点数型に変換します。
import click
@click.command()
@click.option('-opt', '--option', type=click.FLOAT)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 18
option=18.0, type(option)=<class 'float'>
bool型に変換します。bool型TrueやFalseに自動的に変換される値は以下です。
True | False |
---|---|
1 | 0 |
True | False |
true | false |
t | f |
Yes | No |
yes | no |
y | n |
on | off |
import click
@click.command()
@click.option('-opt', '--option', type=click.BOOL)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt y
option=True, type(option)=<class 'bool'>
uuid.UUID
に変換されます。
import click
@click.command()
@click.option('-opt', '--option', type=click.UUID)
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 12345678-1234-5678-1234-567812345678
option=UUID('12345678-1234-5678-1234-567812345678'), type(option)=<class 'uuid.UUID'>
clickの型変換をスキップしたい場合に指定します。
指定されたオプション引数をファイルとして開きます。開かれたファイルはコンテキストが破棄された後自動的に閉じられます。
import click
@click.command()
@click.option('-opt', '--option', type=click.File())
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt test.py
option=<_io.TextIOWrapper name='test.py' mode='r' encoding='cp932'>, type(option)=<class '_io.TextIOWrapper'>
click.File
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
mode | ファイルをどのモードで開くか指定します。 デフォルトは 'r' ('rt' )です。 |
encoding | ファイルのエンコード名を指定します。 テキストモードでのみ指定してください。 |
errors | 文字列でエラーハンドラを指定します。'strict' はエンコーディングエラーがあると例外ValueError を発生させます。デフォルトの動作です。'ignore' はエラーを無視します。'replace' は不正なデータの個所に置換マーカを挿入します。'surrogateescape' は不正なバイトをlow surrogate codeで置き換えます。'xmlcharrefreplace' は不正なデータを、XMLの&#番号 で置き換えます。書き込み時のみサポート。'backslashreplace' は不正なデータをバックスラッシュエスケープシーケンスで置き換えます。'namereplace ‘は不正なデータを'\N{ユニコード名}' に置き換えます。 |
lazy | ファイルをすぐ開く(False の場合)か最初のIO時に開く(True の場合)か指定できます。デフォルトでは標準入出力または読込みモードではすぐ開き( False )、それ以外は最初のIO時に開きます(True )。 |
atomic | アトミックなファイル操作を行うかどうか指定できます。デフォルトはFalse です。True の場合、書込み時にファイルが存在するフォルダに一時ファイルを作成し書き込みます。完了すれば一時ファイルは元のファイルに移動します。 |
また、オプション引数として-
を渡すと、モードが読込みの場合は標準入力に、書込みの場合は標準出力になります。
import click
@click.command()
@click.option('-i', '--input', type=click.File('r'))
@click.option('-o', '--output', type=click.File('w'))
def main(input, output):
text = input.read()
output.write(text)
if __name__ == '__main__':
main()
> python test.py -i - -o test.txt
kotsukotsu san
^Z
> python test.py -i test.txt -o -
kotsukotsu san
渡されたオプション引数はファイルパスとして認識します。
import click
@click.command()
@click.option('-opt', '--option', type=click.Path())
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt src/test.py
option='src/test.py', type(option)=<class 'str'>
click.Path
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
exists | True が指定されていた場合、与えられたパスが存在するかどうかチェックします。存在しなければエラーで終了します。False が指定された存在チェックは行いません。デフォルトはFalse です。 |
file_okay | True が指定された場合、ファイルパスを許可します。False が指定された場合、ファイルパスは許可しません。ただし、パスが存在する場合にファイルパスチェックは有効になります。デフォルトはTrue です。 |
dir_okay | True が指定された場合、ディレクトリパスを許可します。False が指定された場合、ディレクトリパスは許可しません。ただし、パスが存在する場合にディレクトリパスチェックは有効になります。デフォルトはTrue です。 |
writable | True が指定された場合、パスが書き込み可能かチェックします。デフォルトはFalse です。 |
readable | True が指定された場合、パスが読み込み可能かチェックします。デフォルトはTrue です。 |
executable | True が指定された場合、パスが実行可能かチェックします。デフォルトはTrue です。 |
resolve_path | True が指定された場合、絶対パスに変換します。symlinkも解決します。ただし~ は展開されません。デフォルトはFalse です。 |
allow_dash | True が指定された場合、標準入出力としての- を許可します。ただし、オープンはしません。デフォルトはFalse です。 |
path_type | パスを変換する関数を指定します。例えば、pathlib.Path が便利です。デフォルトはNone です。 |
絶対パスに変換して、pathlib.Path
に変換したい場合は以下のようにします。
import click
import pathlib
@click.command()
@click.option('-opt', '--option', type=click.Path(exists=True, resolve_path=True, path_type=pathlib.Path))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt test.py
option=WindowsPath('C:/Users/kotsukotsu/workspace/kotsukotsu_blog/src/test.py'), type(option)=<class 'pathlib.WindowsPath'>
click.Choice
に指定された選択肢からのみ渡されたオプション引数が許可されます。
click.Choice
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
choices | リストまたはタプルで選択肢を指定します。各選択肢は文字列で指定してください。 |
case_sensitive | False が指定された場合、選択肢の大文字と小文字を区別しません。デフォルトはTrue です。 |
import click
@click.command()
@click.option('-opt', '--option', type=click.Choice(choices=['17', '18', '19']))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 18
option='18', type(option)=<class 'str'>
> python test.py -opt 20
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.
Error: Invalid value for '-opt' / '--option': '20' is not one of '17', '18', '19'.
整数の範囲を指定します。
import click
@click.command()
@click.option('-opt', '--option', type=click.IntRange(min=10, max=20))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 9
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.
Error: Invalid value for '-opt' / '--option': 9 is not in the range 10<=x<=20.
> python test.py -opt 10
option=10, type(option)=<class 'int'>
> python test.py -opt 20
option=20, type(option)=<class 'int'>
> python test.py -opt 21
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.
Error: Invalid value for '-opt' / '--option': 21 is not in the range 10<=x<=20.
click.IntRange
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
min | 整数範囲の最小値を指定。 |
max | 整数範囲の最大値を指定。 |
min_open | True が指定された場合、min で指定された整数は範囲に含みません。デフォルトはFalse です。 |
max_open | True が指定された場合、max で指定された整数は範囲に含みません。デフォルトはFalse です。 |
clamp | True が指定された場合、範囲外の整数は範囲内に丸められます。デフォルトはFalse です。 |
例えば、min_open
とclamp
にTrue
を設定した例は以下となります。1を渡した結果、範囲外かつ範囲の最小値10を含まないので11に丸められています。
import click
@click.command()
@click.option('-opt', '--option', type=click.IntRange(min=10, max=20, min_open=True, clamp=True))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 1
option=11, type(option)=<class 'int'>
浮動小数点数の範囲を指定します。
import click
@click.command()
@click.option('-opt', '--option', type=click.FloatRange(min=18.0, max=19.0))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 18.5
option=18.5, type(option)=<class 'float'>
click.FloatRange
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
min | 浮動小数点数範囲の最小値を指定。 |
max | 浮動小数点数範囲の最大値を指定。 |
min_open | True が指定された場合、min で指定された浮動小数点数は範囲に含みません。デフォルトはFalse です。 |
max_open | True が指定された場合、max で指定された浮動小数点数は範囲に含みません。デフォルトはFalse です。 |
clamp | True が指定された場合、範囲外の整数は範囲内に丸められます。デフォルトはFalse です。ただし、 min_open またはmax_open がTrue の場合失敗します。 |
渡されたオプション引数をdatetime
オブジェクトに変換します。
import click
@click.command()
@click.option('-opt', '--option', type=click.DateTime())
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 2022-08-29
option=datetime.datetime(2022, 8, 29, 0, 0), type(option)=<class 'datetime.datetime'>
click.DateTime
メソッドに渡せる引数は以下です。
引数 | 説明 |
---|---|
formats | リストまたはタプルで日時フォーマットを文字列で指定。デフォルトは"[%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] にマッチします。 |
formats
に["%Y年", "%Y年%m月", "%Y年%m月%d日"]
を指定した場合の例です。formats
中の最初にマッチしたものが格納されます。
import click
@click.command()
@click.option('-opt', '--option', type=click.DateTime(formats=["%Y年", "%Y年%m月", "%Y年%m月%d日"]))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 2022年08月
option=datetime.datetime(2022, 8, 1, 0, 0), type(option)=<class 'datetime.datetime'>
複数のtypeを指定する場合に指定します。
以下の例は一つ目のtypeはclick.INT
、2つ目はclick.STRING
を指定しています。
import click
@click.command()
@click.option('-opt', '--option', type=click.Tuple([click.INT, click.STRING]))
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt 17 18
option=(17, '18'), type(option)=<class 'tuple'>
独自のtype変換クラスを定義したい場合以下が要求されます。
click.ParamType
を継承- クラス属性nameに変換type名を文字列で設定
convert
メソッドを独自の変換処理にオーバーライド
以下は、入力されたオプション引数を逆順にして返す変換クラスです。self.fail
メソッドは引数にエラーメッセージを指定すると変換失敗時にエラーメッセージとして出力してくれます。
import click
class Reverse(click.ParamType):
name = 'reverse'
def convert(self, value, param, ctx):
# 文字列かどうか判定
if not isinstance(value, str):
self.fail(f'{value!r}は文字列ではありません。')
try:
return value[::-1] # 文字列を逆順にする
except:
self.fail(f'{value!r}の変換に失敗しました。')
@click.command()
@click.option('-opt', '--option', type=Reverse())
def main(option):
click.echo(f'{option=}, {type(option)=}')
if __name__ == '__main__':
main()
> python test.py -opt abc
option='cba', type(option)=<class 'str'>
本記事では、高機能なオプション解析ライブラリclick
のtypeについてご紹介しました。
基本的な型だけでなく、File型やPath型、DateTime型など様々な型が用意されています。特にFile型はオープンからクローズまでサポートされているので非常に便利です。
さらに、独自のtype変換クラスも定義でき、応用の幅は広がります。
click
に関するほかの記事は以下をご覧ください。
-
【対話オプション】Clickのprompt
clickは、シンプルでありながら高機能なオプション解析ライブラリです。clickのインストールと基本的な使い…
-
[Yes/No]Clickのブールフラグオプション
clickは、シンプルでありながら高機能なオプション解析ライブラリです。clickのインストールと基本的な使い…
-
【文字列や整数だけではない】オプション解析ライブラリClickのtype指定
clickは、シンプルでありながら高機能なオプション解析ライブラリです。clickのインストールと基本的な使い…