[Yes/No]Clickのブールフラグオプション

OSWindows 10 64bit
Python3.10.2
Click8.1.3

概要

clickは、シンプルでありながら高機能なオプション解析ライブラリです。
clickのインストールと基本的な使い方は以下の記事をご覧ください。

【シンプル&高機能】オプション解析ライブラリClickのご紹介【シンプル&高機能】オプション解析ライブラリClickのご紹介

本記事ではclickのブールフラグオプションについてご紹介します。

ブールフラグオプション

ブールフラグオプションは、そのオプションが実行時に指定されていればTrueまたはFalseと解釈されます。

clickではブールフラグオプションの設定方法は以下の3通り用意されています。

  • '/'で区切る
  • is_flagTrueに設定
  • confirmation_optionでデコレート

'/'で区切る

Trueとなるオプション名とFalseとなるオプション名をスラッシュで区切ることで、clickは自動的にブールフラグオプションとして認識されます。
以下はTrueとなるオプションに-y,--yesを、Falseとなるオプションには-n,--noと設定している例です。

Python
import click

@click.command()
@click.option('-y/-n', '--yes/--no')
def main(yes):
    click.echo(f'{yes=}, {type(yes)=}')

if __name__ == '__main__':
    main()
Shell
> python test.py -y     
yes=True, type(yes)=<class 'bool'>

> python test.py -n
yes=False, type(yes)=<class 'bool'>

どちらのオプションも指定しない場合は、デフォルトでFalseが格納されます。@click.optionメソッドのdefaultTrueを設定することで、デフォルトをTrueにすることも可能です。

Shell
> python test.py
yes=False, type(yes)=<class 'bool'>

また、Falseとなる部分のみ、つまり'/'の右部分のみの別名指定することも可能です。ただし、'/'の左部分に空白を入れる必要があります。

Python
import click

@click.command()
@click.option('-y/-n', '--yes/--no', ' /--none')
def main(yes):
    click.echo(f'{yes=}, {type(yes)=}')

if __name__ == '__main__':
    main()
Shell
> python test.py --none
yes=False, type(yes)=<class 'bool'>

また、オプションにすでに'/'が含まれている場合は、';'で区切ることも可能です。

Python
import click

@click.command()
@click.option('/yes;/no')
def main(yes):
    click.echo(f'{yes=}, {type(yes)=}')

if __name__ == '__main__':
    main()
Shell
> python test.py /no
yes=False, type(yes)=<class 'bool'>

is_flagTrueに設定

@click.optionメソッドの引数is_flagTrueに設定すると、そのオプションはフラグオプションとして認識されます。

Python
import click

@click.command()
@click.option('-y', '--yes', is_flag=True)
def main(yes):
    click.echo(f'{yes=}, {type(yes)=}')

if __name__ == '__main__':
    main()
Shell
> python test.py -y
yes=True, type(yes)=<class 'bool'>

> python test.py   
yes=False, type(yes)=<class 'bool'>

@click.optionメソッドの引数defaultをTrueに設定することで逆にすることもできます。

Python
import click

@click.command()
@click.option('-n', '--no', is_flag=True, default=True)
def main(no):
    click.echo(f'{no=}, {type(no)=}')

if __name__ == '__main__':
    main()
Shell
> python test.py -n
no=False, type(no)=<class 'bool'>

> python test.py   
no=True, type(no)=<class 'bool'>

confimation_optionでデコレート

@click.conrimation_optionでデコレートすることで、prompt付きのブールフラグオプションを設定できます。

Python
import click

@click.command()
@click.confirmation_option()
def main():
    click.echo('yesが選択されました。')

if __name__ == '__main__':
    main()
Shell
> python test.py
Do you want to continue? [y/N]: y
yesが選択されました。

> python test.py
Do you want to continue? [y/N]: n
Aborted!
【対話オプション】Clickのprompt【対話オプション】Clickのprompt

まとめ

本記事では、オプション解析ライブラリclickのブールフラグオプションをご紹介しました。ブールフラグオプションはオプションがしていた場合TrueまたはFalseとして格納されるオプションです。フラグによって動作を変えたい場合に非常に便利です。

clickに関するほかの記事は以下をご覧ください。

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です