用add_argument函数的nagrs参数实现命令行多值参数

2019年12月23日 / 83次阅读 / Last Modified 2019年12月23日
argparse模块

argparse模块的add_argument函数,实现增加一个命令行参数的功能。默认情况下,一个命令行参数对应一个值。而add_argument函数有一个nargs参数,通过此参数,可以实现命令行同一个参数的多值输入,以及不确定数量的多值输入。

下面分情况来说明nargs参数不同取值的使用效果。

nargs=N

N表示一个整数,nargs后的整数,必须大于0.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--one', nargs=1, required=True)
args = parser.parse_args()
print(args.one)

nargs=1,表示one参数只能而且必须有1个数值输入。

E:\py>python arg.py --one  1
['1']

E:\py>python arg.py --one  1 2 3
usage: arg.py [-h] --one ONE
arg.py: error: unrecognized arguments: 2 3

只有一个数值输入,但args.one也是一个list。下面我们让nargs=3试试看:

import argparse

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

这时,--three后面就必须有3个数值输入:

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

必须有3个数值跟在--three参数后面,否则就出错。

nargs='?'

这个?表示的含义,与正则表达式里的?一样,即0个或1个的意思。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--zeroOne', nargs='?', required=True)
args = parser.parse_args()
print(args.zeroOne)

下面是运行效果:

E:\py>python arg.py --zeroOne  1
1

E:\py>python arg.py --zeroOne
None

E:\py>python arg.py --zeroOne 1 2
usage: arg.py [-h] --zeroOne [ZEROONE]
arg.py: error: unrecognized arguments: 2

当有2个数值跟--zeroOne参数时,出错;0个和1个都对,不过要注意,1个数值时,返回的不是list,0个时,返回的是None。

nargs='*'

这个 * 表示的含义,与正则表达式里的 * 一样,即0个或多个的意思。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--zeroMore', nargs='*', required=True)
args = parser.parse_args()
print(args.zeroMore)

运行效果如下:

E:\py>python arg.py --zeroMore
[]

E:\py>python arg.py --zeroMore 1
['1']

E:\py>python arg.py --zeroMore 1 2 3 4 5
['1', '2', '3', '4', '5']

注意,使用nargs='*',解析出来的参数是一个list,还可以为空。

还有个细节,当nargs='*'时,argparse模块是通过输入前面是否有 - or -- 来判断是否为下一个参数!请看如下示例,当输入为-k时,-k本身并没有被认为是--zeroMore的一个数值输入。

E:\py>python arg.py --zeroMore 1 2 3 4 5 -k
usage: arg.py [-h] --zeroMore [ZEROMORE [ZEROMORE ...]]
arg.py: error: unrecognized arguments: -k

nargs='+'

这个 + 表示的含义,与正则表达式里的 + 一样,即1个或多个的意思。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--oneMore', nargs='+', required=True)
args = parser.parse_args()
print(args.oneMore)

运行效果跟nargs='*'几乎一样:

E:\py>python arg.py --oneMore
usage: arg.py [-h] --oneMore ONEMORE [ONEMORE ...]
arg.py: error: argument --oneMore: expected at least one argument

E:\py>python arg.py --oneMore 1
['1']

E:\py>python arg.py --oneMore 1 2 3 4 5
['1', '2', '3', '4', '5']

E:\py>python arg.py --oneMore 1 2 3 4 5 -k
usage: arg.py [-h] --oneMore ONEMORE [ONEMORE ...]
arg.py: error: unrecognized arguments: -k

nargs= argparse.REMAINDER

这是一个很有趣的参数类型,当nargs=argparse.REMAINDER时,解决了前面提到的当输入为 - or -- 开始时,argparse自动判断为下一个命令行参数的问题。从字面含义看,后面所有的输入,都是前面那个参数的数值输入。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--remainder', nargs=argparse.REMAINDER, required=True)
args = parser.parse_args()
print(args.remainder)

运行效果如下:

E:\py>python arg.py --remainder
[]

E:\py>python arg.py --remainder 1
['1']

E:\py>python arg.py --remainder 1 2 3 4 5
['1', '2', '3', '4', '5']

E:\py>python arg.py --remainder 1 2 3 4 5 -k 1 2 3 4 5
['1', '2', '3', '4', '5', '-k', '1', '2', '3', '4', '5']

E:\py>python arg.py --remainder ls -lh
['ls', '-lh']

请看以上示例的最后一次运行情况,使用nargs=argparse.REMAINDER,可以通过命令行,输入一个命令行工具,进而调用。

以上就是对add_argument函数nargs参数使用的全部介绍。

-- EOF --

本文链接:https://www.pynote.net/archives/1621

留言区

《用add_argument函数的nagrs参数实现命令行多值参数》有2条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    测试了一下固定位置的参数与nargs='?'的配合,固定位置参数就变成可不输入的参数了! [回复]

  • 麦新杰

    应该是命令行的最后一个参数,使用argparse.REMAINDER [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top