Computer >> Máy Tính >  >> Lập trình >> Python

Làm cách nào để hạn chế các giá trị đối số bằng cách sử dụng các tùy chọn lựa chọn trong Python?

Giới thiệu ..

Giả sử bạn được yêu cầu viết mã một chương trình để chấp nhận số lượng danh hiệu quần vợt từ người dùng và xử lý chúng. Chúng ta đã biết, Federer và Nadal chia sẻ số danh hiệu tối đa trong môn Quần vợt là 20 (Tính đến năm 2020) trong khi mức tối thiểu là 0, rất nhiều tay vợt vẫn đang chiến đấu để có được danh hiệu vô địch đầu tiên của họ.

Hãy để chúng tôi tạo một chương trình để chấp nhận các danh hiệu.

Lưu ý - Thực thi chương trình từ thiết bị đầu cuối.

Ví dụ

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)

Đầu ra

Chương trình của chúng tôi hiện đã sẵn sàng để chấp nhận các danh hiệu. Vì vậy, hãy để chúng tôi chuyển bất kỳ số nào (không phải float) làm đối số.

<<< 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.

Mặc dù không có vấn đề kỹ thuật nào với mã, nhưng chắc chắn có một vấn đề chức năng vì chương trình của chúng tôi đang chấp nhận bất kỳ số lượng tiêu đề GrandSlam nào bao gồm cả tiêu đề phủ định.

Trong những trường hợp chúng tôi muốn hạn chế lựa chọn tiêu đề GrandSlam, chúng tôi có thể sử dụng tùy chọn lựa chọn.

Trong ví dụ sau, chúng tôi giới hạn tiêu đề trong một phạm vi (0, 20).

Ví dụ

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)

Đầu ra

>>> 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)

Kết luận:

  • Tùy chọn lựa chọn có một danh sách các giá trị. argparse dừng chương trình nếu người dùng không cung cấp một trong những thứ này.

  • Người dùng phải chọn từ các số 0-19 nếu không argparse sẽ dừng lại khi có lỗi.

Cuối cùng, Bạn cũng có thể có một chương trình chấp nhận các lựa chọn chuỗi.

Ví dụ

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)

Đầu ra

<<< 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.