Python进阶(七)argparse参数解析

  argparsepython标准库中推荐的命令行解析模块。首先看一段代码,之后对其解析:

import math
import argparse
parser = argparse.ArgumentParser(description="Calculate the x**n (x to the power of n)")
parser.add_argument("x", type=int,help="the data x")
parser.add_argument("n", type=int,help="the power of n")
args = parser.parse_args()

def computer_pow(x,n):
    res = math.pow(x,n)
    print("The Result is: {}".format(res))
    return res
if __name__ == "__main__":
    computer_pow(args.x, args.n)

  首先需要使用import导入argparse模块。

import argparse

  之后所要做的第一件事情就是创建一个参数解析对象parser,将其看作一个装载参数的容器即可(description对这个容器进行解释):

parser = argparse.ArgumentParser(description="Calculate the x**n (x to the power of n)", epilog = 'www.github.com', 
prog='myPythonProgram')

这个地方通常可以用来写程序的用法。还可以添加epilog参数来留一些链接。prog参数来指定 --help 信息中的程序名称。

设置位置参数

  然后可以添加一些参数:

parser.add_argument("x", type=int,help="the data x")
parser.add_argument("n", type=int,help="the power of n")

此处添加的是位置参数,位置参数名称前不要有前缀---,位置参数必须配置,不然会报错。位置参数在命令行中的出现和配置顺序与代码中参数的定义顺序是对应的。如果定义了多个位置参数,命令行输入参数的时候,顺序要与多个参数的定位顺序保持一致

  之后将设置的所有add_argument给返回到args子类实例当中:

args = parser.parse_args()

  使用的时候在终端输入对应的参数即可:

Result

设置可选参数

  上述描述的是位置参数,当然也可以添加可选参数,并为其设置默认值:

parser.add_argument("--x", type=int,help="the data x", default=2)
parser.add_argument("--n", type=int,help="the power of n", default=3)

凡是用-或者 -- 开头定义的命令行参数,都属于可选参数。这里有一个约定俗成的惯例:单个字母只是用一个 - ,多个字母使用两个 -

  此时即可直接运行程序,能够得到一样的结果:

Result

  在终端运行的话,就不想位置参数那样,每个指定位置需要给定什么参数,我们可以通过flag随意指定参数:

Result

必选参数

  通过设置required=True可选参数也可以变成必选参数。必选参数跟位置参数还不一样,必选参数的位置可以比较灵活。

parser.add_argument("--x", type=int,help="the data x", default=2, required=True)
parser.add_argument("--n", type=int,help="the power of n", default=3, required=True)

  这样在终端运行时,如果缺少某个参数,你将会很容易发现,如下图所示:

Result

action参数

  ArgumentParser对象的add_argument函数增加命令行参数,action用来控制命令行参数的(部分)行为方式。

  1. 默认action=‘store’

  默认情况下,action='store',可以不用写出来,含义是保存输入的值。如果require!=True,不输出此命令含参数,值为None

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--moren')
args = parser.parse_args()
print(args.moren)
$ python3 arg_action.py 
None
$ python3 arg_action.py --moren www.pynote.net
www.pynote.net
  1. action=‘store_true’ or action=‘store_false’

  store_true表示如果配置,值为Truestore_false表示如果配置,值为False。这两个action也很常用,此时命令行参数后面不能配置具体的值。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--zhenjia', action='store_true')
args = parser.parse_args()
print(args.zhenjia)
$ python3 arg_action.py --zhenjia
True
  1. action=‘store_const’

  当命令行参数的action='store_const'时,如果配置,它的值为add_argument函数的const参数提供。用const参数来提供某个命令行参数的默认值:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--const', action='store_const', const=123)
args = parser.parse_args()
print(args.const)
$ python3 arg_action.py --const
123
  1. action=‘append’

  将命令行参数值放入list对象中,并且,允许命令行参数多次出现:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tolist', action='append')
args = parser.parse_args()
print(args.tolist)
$ python3 arg_action.py --tolist 1 --tolist 2 --tolist 3
['1', '2', '3']

  与nargs参数实现类似,但是nargs不允许同一个命令行参数多次出现

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()
print(args.three)

# E:\py>python arg.py --three  1 2 3
# ['1', '2', '3']
# 
# E:\py>python arg.py --three  1 2 3 4 5
# usage: arg.py [-h] --three THREE THREE THREE
# arg.py: error: unrecognized arguments: 4 5
# 
# E:\py>python arg.py --three  1 2
# usage: arg.py [-h] --three THREE THREE THREE
# arg.py: error: argument --three: expected 3 arguments

  配合上nargs='+'参数,嵌套多个list的效果如下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--tolist', action='append', nargs='+')
args = parser.parse_args()
print(args.tolist)
# $ python3 arg_action.py --tolist 1 2 --tolist 3 4 5 --tolist 6 7
# [['1', '2'], ['3', '4', '5'], ['6', '7']]
  1. action=‘extend’ (python-3.8)

  在action='append'时,多次出现的同一个命令行参数,参数值保存成了嵌套list的形式。action='extend'优化了此问题,让多个listextend的方式合并成一个list:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--onelist', action='extend', nargs='+')
parser.add_argument('-V', action='version', version='pynote.net V1.2345')
args = parser.parse_args()
print(args.onelist)
# $ python3 arg_action.py --onelist 1 2 3 --onelist 4 5 6
# ['1', '2', '3', '4', '5', '6']
  1. action=‘count’

  这个action用来统计命令行参数出现的次数,出现次数不同,含义也不一样:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--cc', action='count')
args = parser.parse_args()
print(args.cc)
# $ python3 arg_action.py -c
# 1
# $ python3 arg_action.py -ccccc
# 5
# $ python3 arg_action.py --cc --cc --cc
# 3

type参数

  type参数用来指定参数的类型,上文已有初步使用介绍,这里介绍通过type设置任意类型:

import argparse

def take1byte(string):
    """change one-hex-byte to a real byte number"""
    check_list = ['0','1','2','3','4','5','6','7','8','9',
                  'A','B','C','D','E','F']
    if (len(string) != 4 or
        string[0:2] != '0x' or
        string[2] not in check_list or
        string [3] not in check_list): 
        msg = 'Not a valid one-hex-byte with 0x prefix, in upper case.'
        raise argparse.ArgumentTypeError(msg)
    return int(string[2:],16) 

parser = argparse.ArgumentParser()
parser.add_argument('--hex', required=True, type=take1byte)
args = parser.parse_args()
print('your input number is :', str(args.hex))

# E:\py>python arg.py --hex=0x10
# your input number is : 16
# E:\py>python arg.py --hex=0xAA
# your input number is : 170
# E:\py>python arg.py --hex=0xFF
# your input number is : 255
# E:\py>python arg.py --hex=FF
# usage: arg.py [-h] --hex HEX
# arg.py: error: argument --hex: Not a valid one-hex-byte with 0x prefix, in upper case.

互斥参数

  所谓互斥参数,就是在某几个参数中,用户只能在其中选择一个

def main():
    parser = argparse.ArgumentParser()
    timeType = parser.add_mutually_exclusive_group(required=True)
    timeType.add_argument('--day', type=int, 
            help='keep the last x days files')
    timeType.add_argument('--month', type=int, 
            help='keep the last x months files')
    timeType.add_argument('--year', type=int, 
            help='keep the last x years files')
    args = parser.parse_args()

if __name__ == '__main__':
    main()

  通过ArgumentParser对象的add_mutually_exclusive_group函数,定义一个group,以上代码这个group的名称是timeType。然后在这个group中再通过add_argument函数增加具体的命令行参数,凡是在这个timeType中增加的命令行参数,相互直接就是互斥参数!即--day--month--year这三个参数,只能同时在命令行中存在一个。

choices给参数设置范围

  可以通过此参数来给命令行参数的取值设置一个任意的范围。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--cc', type=int, choices=[1,2,3])
args = parser.parse_args()

  choices内的元素类型要与type保持一致,默认为字符串。

metavar参数

  metavar参数,用来控制部分命令行参数的显示,注意:它只是影响部分参数的显示信息,不影响代码内部获取命令行参数的对象

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage:  [-h] [--foo YYY] XXX

positional arguments:
 XXX

optional arguments:
 -h, --help  show this help message and exit
 --foo YYY

dest参数

  dest参数,用来给parse_args()函数返回的对象属性命名的。如果不用dest参数,对于可选参数的引用属性名称,优先选择 -- 开头的那个,如果没有,用 - 开头的那个字母:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-a', '--apple')
_StoreAction(option_strings=['-a', '--apple'], dest='apple', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('-b')
_StoreAction(option_strings=['-b'], dest='b', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

  -a参数的dest='apple'-b参数的dest='b'

  用dest参数的效果:

>>> parser.add_argument('-c', dest='cpp')
_StoreAction(option_strings=['-c'], dest='cpp', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

  -c参数的dest='cpp'

我的微信公众号名称:小小何先生
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值