Python argparse如果不是整数就跳过。

3

我希望有3个可选的位置参数(intint,然后是str)。

我的要求:

$ ./args.py 0 100 vid
start=0
end=100
video='vid'

$ ./args.py 0 100
start=0
end=100
video=None

$ ./args.py 0
start=0
end=None
video=None

$ ./args.py vid
start=None
end=None
video='vid'

$ ./args.py
start=None
end=None
video=None

我尝试过的内容:

#!/usr/bin/python3
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('start', type=int, nargs='?')
parser.add_argument('end',   type=int, nargs='?')
parser.add_argument('video', type=str, nargs='?')

print(parser.parse_args())

那段代码存在的问题是:
$ ./args.py vid
usage: args.py [-h] [start] [end] [video]
args.py: error: argument start: invalid int value: 'vid'
< p > argparse 知道 'vid' 不是整数,所以我希望它可以“跳过”前两个参数startend,因为它们不匹配。

当我把video参数设为强制性时,它的效果更好:

parser.add_argument('start', type=int, nargs='?')
parser.add_argument('end',   type=int, nargs='?')
parser.add_argument('video', type=str)

演示:

# Fine!
$ ./args.py 0 100 vid
start=0
end=100
video='vid'

# Fine!
$ ./args.py vid
start=None
end=None
video='vid'

# Not fine
./args.py 
usage: args.py [-h] [start] [end] video
args.py: error: the following arguments are required: video

你尝试设置视频的默认值了吗? - miraculixx
type 不匹配时,argparse 会引发错误;它不会跳过该参数或继续尝试其他参数。像这样的位置值严格按位置而不是值分配。 - hpaulj
2个回答

1
我认为你应该加上你的参数叫什么:
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-s', '--start', type=int)
parser.add_argument('-e', '--end', type=int)
parser.add_argument('-v', '--video', type=str)

args = parser.parse_args()
for arg in vars(args):
    print(arg, '=', getattr(args, arg))

那样你就可以指定参数,避免混淆:
$ ./args.py -s 0 -e 100 -v vid
start = 0
end = 100
video = vid
$ ./args.py -s 0 -e 100
start = 0
end = 100
video = None
$ ./args.py -s 0
start = 0
end = None
video = None
$ ./args.py -v vid
start = None
end = None
video = vid
$ ./args.py
start = None
end = None
video = None
$ ./args.py vid
usage: args.py [-h] [-s START] [-e END] [-v VIDEO]
args.py: error: unrecognized arguments: vid

注意: 上述参数中包含了短别名。例如,您可以使用-s代替--start


1

我认为没有干净的内置方法来完成这个任务。因此,你需要将所有选项收集到一个列表中,并自己解析它们。

例如:

parser.add_argument('start_end_video', nargs='*')
args=parser.parse_args()
if len(args.start_end_video) == 1:
   video = args.start_end_video
elif len(args.start_end_video) == 3:
   start, end, video = args.start_end_video

等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接