コマンドライン引数のブール値を解析する

Vaibhav Vaibhav 2022年4月14日
コマンドライン引数のブール値を解析する

コマンドプロンプト、Git Bash、Linux ターミナル、MAC シェルなど、任意のコマンドラインから Python スクリプトを実行する場合、それらに引数または値を渡すことができます。これらの値は、コマンドライン引数と呼ばれます。

これらの引数は通常、整数、浮動小数点数、文字列、および文字列として表されるブール値です。つまり、コード内で型キャストする必要があります。

この記事では、Python を使用してコマンドライン引数からブール値を解析する方法を学習します。

Python の argparse モジュールを使用してコマンドライン引数からブール値を解析する

Python には、一般的で反復的なプログラミングの問題を解決することを目的とした、mathrandomjsoncsv などの重要な組み込みモジュールが多数あります。そのようなパッケージの 1つは、プログラマーがユーザーフレンドリーなコマンドラインインターフェイスをすばやく作成するのに役立つ argparse です。このモジュールを使用すると、プログラムが正しく機能するために必要な引数を定義できます。

定義とは別に、argparse モジュールはデフォルト値、エラーメッセージ、ヘルプテキストを定義し、検証、型キャスト、変換などの値に対して一般的なアクションを実行することもできます。このユースケースでは argparse モジュールを使用できます。

正しく動作するために文字列値と 2つのブール値を必要とするプログラムを実装します。これは、目的を理解するための単なる例です。

次の Python コードを参照してください。

import argparse


def parse_boolean(value):
    value = value.lower()

    if value in ["true", "yes", "y", "1", "t"]:
        return True
    elif value in ["false", "no", "n", "0", "f"]:
        return False

    return False


def output(name, burger, cake):
    if burger and cake:
        return f"{name} is eating a burger and a cake."
    elif burger:
        return f"{name} is eating a burger."
    elif cake:
        return f"{name} is eating a cake."

    return f"{name} is eating nothing."


parser = argparse.ArgumentParser(
    description="A program that accepts one string and two boolean values."
)
parser.add_argument("name", help="Name of a person.")
parser.add_argument(
    "--burger", type=parse_boolean, default=False, help="Flag for burger."
)
parser.add_argument("--cake", type=parse_boolean, default=False, help="Flag for cake.")
args = parser.parse_args()
print(output(args.name, args.burger, args.cake))

Python コードの説明

上記の Python コードは、最初に ArgumentParser クラスのオブジェクトを作成します。このクラスには、コマンドライン引数を解析するためのすべてのユーティリティがあります。以下は、このクラスのクラスシグネチャです。

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True)

これらの引数はすべてキーワード引数であり、キーワード引数としてクラスに渡す必要があります。

次に、このオブジェクトの add_argument() 関数を使用して、パーサーに引数を追加します。以下は、この関数の主な引数の一部です。

  • name - 名前またはオプション文字列のリスト。たとえば、world、または --world-w
  • action - この引数がコマンドライン引数にある場合に実行するアクション。
  • nargs - 考慮する必要のあるコマンドライン引数の数。
  • type - 引数の変換先となるデータ型。
  • const - action および nargs に必要な定数値。
  • default - コマンドライン引数に引数がない場合に考慮すべきデフォルト値。
  • help - 引数のヘルプテキスト。

name--burger--cake の 3つの引数を追加します。ここで、name は位置引数であり、--burger--cake は 2つのオプションの引数です。各引数のヘルプテキストを定義し、オプションの引数の場合はデフォルト値も定義します。

次に、parse_args() メソッドを使用して、文字列引数をそれぞれのオブジェクトまたはデータ型に変換します。このメソッドは、それぞれの変換された値を指すキーとしてすべての引数を含む名前空間オブジェクトを返します。これらのタイプキャストされた値には、次のようにアクセスできます。

args.name
args.burger
args.cake

また、parse_boolean()output() の 2つの関数も定義します。parse_boolean() 関数は、オプションのブール引数の横にあるコマンドライン引数として入力された値を受け入れます。次に、値を解釈し、対応するブール値を返します。

ここで、関数は任意のぎこちない値に対して False を返すことに注意してください。デフォルト値を返す代わりに、例外を発生させることもできます。次のコマンドを使用してテストできます。

python main.py Vaibhav --burger Hello --cake World

出力:

Vaibhav is eating nothing.

もう 1つの関数は output() 関数です。この関数は、3つの値(1つの文字列と 2つのブール値)を受け入れ、適切な出力文字列を返します。

テスト

プログラムをテストするには、任意のコマンドラインから次のコマンドを実行します。次のコマンドは、上記の Python コードが main.py という名前のファイル内に存在することを考慮していることに注意してください。

python main.py Vaibhav --burger True --cake True
python main.py Vaibhav --burger T --cake 0
python main.py Vaibhav --burger False --cake False
python main.py Vaibhav --burger True --cake False
python main.py Vaibhav --burger False --cake True
python main.py Vaibhav --burger ABC --cake XYZ
python main.py Vaibhav
python main.py Vaibhav --burger True
python main.py Vaibhav --cake False
python main.py

出力:

Vaibhav is eating a burger and a cake.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating a cake.
Vaibhav is eating nothing.
Vaibhav is eating nothing.
Vaibhav is eating a burger.
Vaibhav is eating nothing.
usage: main.py [-h] [--burger BURGER] [--cake CAKE] name
main.py: error: the following arguments are required: name

ご覧のとおり、最後のコマンド python main.py はエラーをスローします。同じ理由は単純です。name は、位置的かつ強制的な引数です。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.