argparse详解

argparse详解

  • 1 positional argument 与 optional argument
    • 1.1 二者的区别
    • 1.2 optional argument 前缀“-”与前缀“--”
    • 1.3 optional argument 的 flag
  • 2.action
    • 2.1 action=store_true
    • 2.2 action=store_false
    • 2.3 action=store_const
    • 2.4 action='append'
  • 3.nargs
    • 3.1 nargs=N
    • 3.2 nargs='?'
    • 3.3 nargs='+'
    • 3.4 nargs='*'
  • 4.其他参数
    • 4.1 required
    • 4.2 choices
    • 4.3 metavar
    • 4.4 dest
  • 5.vars()
  • 6.帮助信息的产生
    • 6.1 代码中添加ArgumentParser.print_help()
    • 6.2 cmd中使用参数--help/-h
  • 参考文献

本文的示例代码文件名为tem.py

1 positional argument 与 optional argument

1.1 二者的区别

以如下代码为例:

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('--num', action='store_const', const=10)
    parser.add_argument('integer', type=int)
    parser.print_help()

在cmd中运行py tem.py,显示:

usage: tem.py [-h] [--num] integer

Process some integers.

positional arguments:
  integer

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

可以看出,代码中integer为positional arguments,num为optional arguments。

二者的差别在于参数有没有前缀“-”。

1.2 optional argument 前缀“-”与前缀“–”

那么前缀“-”与前缀“–”有什么差别呢?

import argparse

if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-num','--n', action='store_const', const=10)
    args = parser.parse_args()
    print(args)

在cmd中运行py tem.py,输出为:

Namespace(n=None)

运行py tem.py -numpy tem.py --n,输出为:

Namespace(n=10)

可见,当有多个字符串时,参数的识别是通过“–”,而不是字符串的长度。

类似的,如果有多个相同前缀(“-”或“–”)的字符串,参数识别为第一个字符串。

parser.add_argument('-num','-n', action='store_const', const=10)
#parser.add_argument('--num','--n', action='store_const', const=10)
#Namespace(num=10)

1.3 optional argument 的 flag

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('--num','-n', action='store_const', const=10)
    args = parser.parse_args()
    print(args)

'-n’可称为是flag,起作用可为在cmd中方便输入命令,而不会保存为argparse中的参数。

py tem.py -n
#Namespace(num=10)

py tem.py --num
#Namespace(num=10)

2.action

2.1 action=store_true

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--output', action='store_true')
    opt = parser.parse_args()
    print(opt)

在cmd输入py tem.py,则输出:

Namespace(output=False)

注意:如果此语句中设置了default,则cmd运行py tem.py,该变量值=default。

parser.add_argument("-v", "--verbose", action="store_true",
                    default=True, help="verbose output")

如果带上参数py tem.py --output,则输出:

Namespace(output=True)

2.2 action=store_false

与 2.1 类似,不再赘述。

2.3 action=store_const

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('--num', action='store_const', const=10)
    args = parser.parse_args()
    print(args)

在cmd中运行py tem.py --num,则输出:

Namespace(num=10)

同样的,如果直接允许py tem.py ,num就会赋值为default(default若未设置,则为None)。

2.4 action=‘append’

实现效果同3.3,但3.3操作更加方便。

import argparse

if __name__=="__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--ls', action='append', type=int)
    opt = parser.parse_args()
    print(opt)

在cmd中直接执行py tem.py:

py tem.py --ls 1 --ls 2
#Namespace(ls=[1, 2])

3.nargs

3.1 nargs=N

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--ls', nargs=2, type=int)
    opt = parser.parse_args()
    print(opt)

该参数只能输入N个值,多或少都会报错。
如N=2,cmd中只为其输入一个值,报错如下:

usage: tem.py [-h] [--ls LS LS]
tem.py: error: argument --ls: expected 2 arguments

3.2 nargs=’?’

parser.add_argument('--ls', nargs='?', type=int)

只解析一个输入参数值,多于1个则报错。

3.3 nargs=’+’

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--ls', nargs='+', type=int)
    opt = parser.parse_args()
    print(opt)

在cmd中直接执行py tem.py:

py tem.py --ls 1 2
#Namespace(ls=[1, 2])

3.4 nargs=’*’

nargs='*'nargs='+'效果类似。

4.其他参数

4.1 required

若设置required=True,则cmd中必须输入该参数,否则会产生错误。

parser.add_argument("--pattern","-p", type=str, required=True,default="plane",choices=['plane', 'line'], help="plane:面,line:线")

如果在cmd中直接执行py tem.py,则会报如下错误:

usage: tem.py [-h] --pattern {plane,line} [-1]
tem.py: error: the following arguments are required: --pattern/-p

4.2 choices

若有choices,则在cmd中该参数的值只能从choices中选择,否则会报错:
如cmd中执行py tem.py -p ln

usage: tem.py [-h] --pattern {plane,line} [-1]
tem.py: error: argument --pattern/-p: invalid choice: 'ln' (choose from 'plane', 'line')

4.3 metavar

设置metavar仅为在生成帮助消息parser.print_help()时,以某种方式来显示预期的形式。

import argparse
if __name__=="__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-xyz', nargs=3)
    parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
    parser.print_help()

显示如下:

usage: PROG [-h] [-xyz XYZ XYZ XYZ] [--foo bar baz]

optional arguments:
  -h, --help        show this help message and exit
  -xyz XYZ XYZ XYZ
  --foo bar baz
Namespace(foo=None, xyz=None)

xyz 参数无metavar,显示为:-xyz XYZ XYZ XYZ
而foo 参数设置了metavar,显示为:--foo bar baz

用处似乎不大。

4.4 dest

在argparse中,参数名默认为:

  • 对于positional argument,dest即为第一个字符串。

如:

parser.add_argument('num',action='store_const', const=10)

dest为’num’。

  • 对于optional argument ,
For optional argument actions, the value of dest is normally inferred from the option strings. 

ArgumentParser generates the value of dest by taking the first long option string and stripping away the initial -- string. 

If no long option strings were supplied, dest will be derived from the first short option string by stripping the initial - character. 

Any internal - characters will be converted to _ characters to make sure the string is a valid attribute name. 

大致意思和1.2节差不多,不再描述。

而如果设置了dest,则可以自定义参数名。

import argparse

if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-num',dest='n',action='store_const', const=10)

    args = parser.parse_args()
    print(args)
    print(args.n)
    print(args.num)

cmd中执行该代码py tem.py -num

Namespace(n=10)
10
Traceback (most recent call last):
  File "tem.py", line 18, in <module>
    print(args.num)
AttributeError: 'Namespace' object has no attribute 'num'

可见参数名已经修改为n,原先的optional argument '-num’不能再作为参数名了。

5.vars()

通过此方法可以把parser 对象变成dict对象。

type(vars(opt))
Out: dict

6.帮助信息的产生

6.1 代码中添加ArgumentParser.print_help()

import argparse

if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-num',dest='n',action='store_const', const=10)
    parser.print_help()
    args = parser.parse_args()

cmd中运行py tem.py -num,输出为:

usage: tem.py [-h] [-num]

Process some integers.

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

6.2 cmd中使用参数–help/-h

import argparse

if __name__=="__main__":
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-num',dest='n',action='store_const', const=10)
    # parser.print_help()
    args = parser.parse_args()

cmd中运行py tem.py -h,输出为:

usage: tem.py [-h] [-num]

Process some integers.

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

参考文献

[1] https://docs.python.org/zh-cn/3.7/library/argparse.html#module-argparse

你可能感兴趣的:(python)