具有1或3个位置参数的python脚本

我正在编写python脚本,它需要3个位置参数(例如名称,日期,位置)或1个参数,这是一个包含该信息的安装文件.

我知道我可以使用argparse,并且可以通过以下方式使位置参数成为可选参数:

parser.add_argument('name_OR_setupFile')
parser.add_argument('date', nargs='?')
parser.add_argument('location', nargs='?')

然后我可以进行错误检查,以确保用户没有做任何愚蠢的事情

问题在于,现在的帮助消息将非常混乱,因为尚不清楚第一个参数的含义是什么.我希望以某种方式将其作为两条不同的add_argument行来执行此操作,但是我不确定如何执行.

我也知道我可以使用–setupFile参数,并使这三个参数成为可选参数……但是我宁愿不要这样做,如果不需要的话.

第三种选择是使用:

parser.add_argument('ARGS', nargs='+', help='ARGS is either of the form setupFile, or name date location')

然后稍后进行错误检查…

预计到达时间:

我希望能够使用以下任一方法调用脚本:

python foo.py setupFile

要么

python foo.py name date location

我希望帮助文本如下所示:

usage:
foo.py setupFile
foo.py name date location

最佳答案

我认为使用argparse的最清晰的设计是:

parser = argparse.ArgumentParser()
g = parser.add_mutually_exclusive_group()
g.add_argument('--setup','-s',metavar='FILE',help='your help')
g.add_argument('--name',nargs=3,metavar=('NAME','DATE','LOCATION'),hel
     ...: p='your help')

parser.print_help()产生:

usage: ipython3 [-h] [--setup FILE | --name NAME DATE LOCATION]

optional arguments:
  -h, --help            show this help message and exit
  --setup FILE, -s FILE
                        your help
  --name NAME DATE LOCATION
                        your help

我已经使用互斥的可选参数处理了1或3个参数要求.并使用metavar来增加参数的清晰度. (正如最近另一个问题所指出的那样,metavar在位置上不能很好地工作.)

另一种选择是使用子解析器.这仍然需要诸如设置和名称之类的关键字,只有它们输入时不带-.次级解析器的帮助结构也大不相同.