Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの選択オプションを使用して引数値を制限するにはどうすればよいですか?


はじめに..

ユーザーからテニスのグランドスラムタイトルの数を受け入れて処理するプログラムをコーディングするように求められたとします。フェデラーとナダルがテニスで最大のグランドスラムタイトルを共有していることはすでに知っています(2020年現在)。最小は0ですが、多くのプレーヤーがまだ最初のグランドスラムタイトルを獲得するために戦っています。

タイトルを受け入れるプログラムを作成しましょう。

-端末からプログラムを実行します。

import argparse

def get_args():
""" Function : get_args
parameters used in .add_argument
1. metavar - Provide a hint to the user about the data type.
- By default, all arguments are strings.

2. type - The actual Python data type
- (note the lack of quotes around str)

3. help - A brief description of the parameter for the usage

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Adding our first argument player titles of type int
parser.add_argument('titles',
metavar='titles',
type=int,
help='GrandSlam Titles')

return parser.parse_args()

# define main
def main(titles):
print(f" *** Player had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.titles)

出力

これで、プログラムはタイトルを受け入れる準備ができました。それでは、引数として任意の数(浮動小数点ではない)を渡しましょう。

<<< python test.py 20
*** Player had won 20 GrandSlam titles.
<<< python test.py 50
*** Player had won 50 GrandSlam titles.
<<< python test.py -1
*** Player had won -1 GrandSlam titles.
<<< python test.py 30
*** Player had won 30 GrandSlam titles.

コードに技術的な問題はありませんが、私たちのプログラムはネガティブタイトルを含む任意の数のGrandSlamタイトルを受け入れているため、明らかに機能上の問題があります。

GrandSlamタイトルの選択を制限したい場合は、choicesオプションを使用できます。

次の例では、タイトルを範囲(0、20)に制限しています。

import argparse
def get_args():
""" Function : get_args
parameters used in .add_argument
1. metavar - Provide a hint to the user about the data type.
- By default, all arguments are strings.

2. type - The actual Python data type
- (note the lack of quotes around str)

3. help - A brief description of the parameter for the usage

4. choices - pre defined range of choices a user can enter to this program

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Adding our first argument player titles of type int
parser.add_argument('titles',
metavar='titles',
type=int,
choices=range(0, 20),
help='GrandSlam Titles')

return parser.parse_args()

# define main
def main(titles):
print(f" *** Player had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.titles)

出力

>>> python test.py 30
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: 30 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py 10
*** Player had won 10 GrandSlam titles.
<<< python test.py -1
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: -1 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py 0
*** Player had won 0 GrandSlam titles.
<<< python test.py 20
usage: test.py [-h] titles
test.py: error: argument titles: invalid choice: 20 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

結論:

  • choicesオプションは、値のリストを取ります。ユーザーがこれらのいずれかを指定しなかった場合、argparseはプログラムを停止します。

  • ユーザーは0〜19の数字から選択する必要があります。そうしないと、argparseはエラーで停止します。

最後に、文字列の選択を受け入れるプログラムを作成することもできます。

import argparse

def get_args():
""" Function : get_args
parameters used in .add_argument
1. metavar - Provide a hint to the user about the data type.
- By default, all arguments are strings.

2. type - The actual Python data type
- (note the lack of quotes around str)

3. help - A brief description of the parameter for the usage

4. choices - pre defined range of choices a user can enter to this program

"""

parser = argparse.ArgumentParser(
description='Example for one positional arguments',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Adding our first argument player names of type str.
parser.add_argument('player',
metavar='player',
type=str,
choices=['federer', 'nadal', 'djokovic'],
help='Tennis Players')

# Adding our second argument player titles of type int
parser.add_argument('titles',
metavar='titles',
type=int,
choices=range(0, 20),
help='GrandSlam Titles')

return parser.parse_args()

# define main
def main(player,titles):
print(f" *** {player} had won {titles} GrandSlam titles.")

if __name__ == '__main__':
args = get_args()
main(args.player,args.titles)

出力

<<< python test.py
usage: test.py [-h] player titles
test.py: error: the following arguments are required: player, titles
<<< python test.py "federer" 30
usage: test.py [-h] player titles
test.py: error: argument titles: invalid choice: 30 (choose from 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
<<< python test.py "murray" 5
usage: test.py [-h] player titles
test.py: error: argument player: invalid choice: 'murray' (choose from 'federer', 'nadal', 'djokovic')
<<< python test.py "djokovic" 17
*** djokovic had won 17 GrandSlam titles.

  1. PythonでCerberusを使用してデータを検証する方法

    はじめに PythonのCerberusモジュールは、強力でありながら軽量のデータ検証機能を提供します。さまざまなアプリケーションやカスタム検証に拡張できるように設計されています。 最初にスキーマを定義し、次にスキームに対してデータを検証し、提供された条件に一致するかどうかを確認します。そうでない場合は、正確なエラーがスローされ、問題が発生した場所が表示されます。 検証のために、さまざまな条件をデータフィールドに一度に適用できます。 はじめに Cerberusを使用するには、Pythonにパッケージ化されていないため、最初にインストールする必要があります。 ダウンロードしてインストー

  2. Pythonでscikit-learnを使用して画像のピクセル値を表示するにはどうすればよいですか?

    データの前処理とは、基本的に、すべてのデータ(さまざまなリソースまたは単一のリソースから収集される)を共通の形式または統一されたデータセット(データの種類に応じて)に収集するタスクを指します。 実際のデータは決して理想的ではないため、データにセルの欠落、エラー、外れ値、列の不一致などが含まれる可能性があります。 場合によっては、画像が正しく配置されていないか、鮮明でないか、サイズが非常に大きいことがあります。前処理の目標は、これらの不一致やエラーを取り除くことです。 画像のピクセルを取得するには、「flatten」という名前の組み込み関数を使用します。画像が読み取られた後、ピクセル値はデ