Python argparse 如果不是 int 则跳过

标签 python argparse

我想要 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'

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

最佳答案

我认为没有内置的方法可以干净利落地做到这一点。因此,您只需将所有选项收集到一个列表中并自行解析它们。

例如

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

等等

关于Python argparse 如果不是 int 则跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944971/

相关文章:

python - 断言函数没有传入参数被调用

python - 在 argparse 中设置互斥集

Python:argparse 读取 csv 文件以发挥作用

python - 如何使用 argparse 获得不带连字符 (--) 的可能参数列表

python - apt-get purge 做了什么?

python - 对 Pandas 数据框进行排序

python - 使用 Prometheus Python 客户端时出现时间戳错误 - "Error on ingesting samples that are too old or are too far into the future"

Python:访问另一个文件中的函数中的变量

python - argparse 将默认设置为多个参数

python argparse 字符串列表的选择接受唯一的部分列表元素