Python 如何将位置参数与可选参数相结合?

Python 如何将位置参数与可选参数相结合?,python,argparse,Python,Argparse,让我们假设我对myprog有一些用法: myprog.py [-h] [-d DEPTH] [-v] [--version] URL [URL ...] 现在我只想在指定了单个位置参数URL时才允许-d DEPTH选项。例如,这是一个正确的命令: my_prog.py http://stackoverflow.com -d 5 my_prog.py http://stackoverflow.com http://google.com 但不允许使用此URL(URL的数量超过一个): 所以,现在

让我们假设我对myprog有一些用法:

myprog.py [-h] [-d DEPTH] [-v] [--version] URL [URL ...]
现在我只想在指定了单个位置参数
URL
时才允许
-d DEPTH
选项。例如,这是一个正确的命令:

my_prog.py http://stackoverflow.com -d 5
my_prog.py http://stackoverflow.com http://google.com
但不允许使用此URL(URL的数量超过一个):

所以,现在我试着检查这个案例,如下所示:

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://stackoverflow.com http://google.com
也就是说,在URL参数之前指定了
-d
。因为参数可以按任意顺序给出,所以在解析完成后测试它们是最有意义的——就像您正在做的那样


可以构造自定义操作类来测试这样的事情,但是逻辑变得更加复杂。“url”操作必须测试以前的“-d”设置,“-d”必须测试“url”属性,等等。

我认为这个解决方案很棒。你为什么不呢?Argparser不应该对所有可能的情况都有一个内置的方法。谢谢你的回答
my_prog.py -d 5 http://stackoverflow.com http://google.com