📜  如何在Python中使用 argparse 处理无效参数?

📅  最后修改于: 2022-05-13 01:55:25.001000             🧑  作者: Mango

如何在Python中使用 argparse 处理无效参数?

Argparse 模块提供了改进命令行界面的工具。与该模块相关的方法使得为命令行界面程序编写代码以及更好的交互变得容易。此模块自动生成帮助消息并在传递不适当的参数时引发错误。它甚至允许自定义在参数无效的情况下显示的消息。

处理无效参数的方法

1.用户自定义函数和'type'参数

argparse 模块有一个名为add_arguments()的函数,其中给出了参数应转换为的类型。可以将用户定义的函数作为值传递给此参数,而不是使用可用值。这在许多情况下都会很有用,因为我们可以定义我们自己的标准,以使参数在转换后有效。例如,让我们举一个简单的例子。必须输入 5 到 15 范围内的数字,如果超过,则必须在转换后立即引发错误。否则,将显示数字的平方。查看下面保存为find_square.py的Python代码

Python
import argparse
  
# function to convert the input and 
# check the range
def checker(a):
    num = int(a)
      
    if num < 5 or num > 15:
        raise argparse.ArgumentTypeError('invalid value!!!')
    return num
  
  
parser = argparse.ArgumentParser(
    description='Processing integers in range 5 to 15')
  
# passing the function for 'type' parameter
parser.add_argument('n', type=checker)
  
res = parser.parse_args()
print("square is :", res.n*res.n)


Python
import argparse
  
# function to check user name
def checker(a):
    if len(a) > 8 or len(a) < 5:
        raise argparse.ArgumentTypeError(
            'user name should have atleast 5 characters \
            but not more than 8 characters!!!')
    return
  
# function to check password
def checker_pwd(b):
  
    d = 0  # initial count of digits
    a = 0  # initial count of alphabets
    ss = 0  # initial count of special characters
  
    for i in range(0, len(b)):
      # increment alphabet count
        if (b[i] >= 'a' and b[i] <= 'z') or (b[i] >= 'A' and b[i] <= 'Z'):
            a = a+1
  
      # increment digit count
        elif (b[i] >= '0' and b[i] <= '9'):
            d = d+1
  
       # increment special characters count
        else:
            ss = ss+1
  
    # check criteria
    if d < 1 or a < 2 or ss < 1 or len(b) > 6:
        raise argparse.ArgumentTypeError(
            'Password doesnt match the criterias!!')
    return
  
  
parser = argparse.ArgumentParser()
parser.add_argument('uname', type=checker)
parser.add_argument('pwd', type=checker_pwd)
parser.parse_args()


Python
import argparse
  
parser = argparse.ArgumentParser()
  
# a variable to hold odd numbers
ref_arg1 = parser.add_argument('odd', type=int)
  
# a variable to hold even number
ref_arg2 = parser.add_argument('even', type=int)
  
args = parser.parse_args()
  
# raising error in cas of
if args.odd % 2 == 0:
    raise argparse.ArgumentError(ref_arg1, "Argument 1 Can't \
    be even number!!")
  
if args.even % 2 != 0:
    raise argparse.ArgumentError(ref_arg1, "Argument 2 Can't be\
    odd number!!")


输出:

find_square.py 输出

如果传递的参数不在给定的范围内,例如第一次给定的参数上面的图像' 3 ',错误信息无效值!!!被陈列。下次传递的参数是指定范围内的10 ,因此打印 10 的平方。

现在,看另一个示例,您不想键入转换输入但指定一些条件,以便它可以是有效输入。下面给出的程序有两个参数 - uname, pwd (user name, password) 。这里设置用户名的标准是,至少有5个字符,但不超过8个。密码必须至少有1个数字,至少2个字母,至少1个特殊字符。解析器设置为以这种方式处理,程序存储为pwd_check.py

Python

import argparse
  
# function to check user name
def checker(a):
    if len(a) > 8 or len(a) < 5:
        raise argparse.ArgumentTypeError(
            'user name should have atleast 5 characters \
            but not more than 8 characters!!!')
    return
  
# function to check password
def checker_pwd(b):
  
    d = 0  # initial count of digits
    a = 0  # initial count of alphabets
    ss = 0  # initial count of special characters
  
    for i in range(0, len(b)):
      # increment alphabet count
        if (b[i] >= 'a' and b[i] <= 'z') or (b[i] >= 'A' and b[i] <= 'Z'):
            a = a+1
  
      # increment digit count
        elif (b[i] >= '0' and b[i] <= '9'):
            d = d+1
  
       # increment special characters count
        else:
            ss = ss+1
  
    # check criteria
    if d < 1 or a < 2 or ss < 1 or len(b) > 6:
        raise argparse.ArgumentTypeError(
            'Password doesnt match the criterias!!')
    return
  
  
parser = argparse.ArgumentParser()
parser.add_argument('uname', type=checker)
parser.add_argument('pwd', type=checker_pwd)
parser.parse_args()

输出:

pwd_check.py 输出

  • 第一次运行:参数是geek 12345678 。用户名至少应包含 5 个字符。
  • 第二轮:论据是极客 12345678 。不满足密码条件。
  • 第三轮:论据是极客 123abc@# 。这些通过了所有约束,因此系统退出

2. 使用 ArgumentError()

这个函数有两个参数,即参数和要显示的消息。要使用它,应该设置一个引用参数的变量。看下面的例子。该程序从用户那里获取两个值,第一个应该是奇数,第二个应该是偶数。它被保存为odd_even.py

Python

import argparse
  
parser = argparse.ArgumentParser()
  
# a variable to hold odd numbers
ref_arg1 = parser.add_argument('odd', type=int)
  
# a variable to hold even number
ref_arg2 = parser.add_argument('even', type=int)
  
args = parser.parse_args()
  
# raising error in cas of
if args.odd % 2 == 0:
    raise argparse.ArgumentError(ref_arg1, "Argument 1 Can't \
    be even number!!")
  
if args.even % 2 != 0:
    raise argparse.ArgumentError(ref_arg1, "Argument 2 Can't be\
    odd number!!")

输出:

奇偶数.py 输出