如何将位置参数与可选参数结合起来?
How to combine positional argument with an optional one?
假设我对 myprog 有一些用法:
myprog.py [-h] [-d DEPTH] [-v] [--version] URL [URL ...]
现在我只想在指定 单个 位置参数 URL
时允许 -d DEPTH
选项。例如,这是一个正确的命令:
my_prog.py http://whosebug.com -d 5
my_prog.py http://whosebug.com http://google.com
但是这个不应该被允许(url 的数量超过一个):
my_prog.py http://whosebug.com http://google.com -d 5
所以,现在我正在尝试按如下方式检查此案例:
parser = get_parser()
args = vars(parser.parse_args())
if args['depth'] > 1:
if len(args['url']) != 1:
parser.error('DEPTH parameter is allowed with single URL')
return
我觉得这个方案不太好。
想必您也想禁止
my_prog.py -d 5 http://whosebug.com http://google.com
即当在URL参数之前指定-d
时。由于参数可以按任意顺序给出,因此在解析完成后测试它们最有意义 - 正如您所做的那样。
可以构建自定义 Action 类 来测试这样的事情,但逻辑会变得更加复杂。 'url' 操作必须测试之前的“-d”设置,而“-d”必须测试 'url' 属性等。
假设我对 myprog 有一些用法:
myprog.py [-h] [-d DEPTH] [-v] [--version] URL [URL ...]
现在我只想在指定 单个 位置参数 URL
时允许 -d DEPTH
选项。例如,这是一个正确的命令:
my_prog.py http://whosebug.com -d 5
my_prog.py http://whosebug.com http://google.com
但是这个不应该被允许(url 的数量超过一个):
my_prog.py http://whosebug.com http://google.com -d 5
所以,现在我正在尝试按如下方式检查此案例:
parser = get_parser()
args = vars(parser.parse_args())
if args['depth'] > 1:
if len(args['url']) != 1:
parser.error('DEPTH parameter is allowed with single URL')
return
我觉得这个方案不太好。
想必您也想禁止
my_prog.py -d 5 http://whosebug.com http://google.com
即当在URL参数之前指定-d
时。由于参数可以按任意顺序给出,因此在解析完成后测试它们最有意义 - 正如您所做的那样。
可以构建自定义 Action 类 来测试这样的事情,但逻辑会变得更加复杂。 'url' 操作必须测试之前的“-d”设置,而“-d”必须测试 'url' 属性等。