我应该如何构造argparse来构建它?

时间:2016-04-28 02:34:40

标签: python argparse

我应该如何构建argparse来构建它?你应该能够调用-l,-m,-s,-h,home或work,但不能同时调用两者。您必须先调用-l或-m才能使用任何-i。

usage: prog 
           (-l | -m ) [-i1][-i2][-i3][-i4]
           -s
           -h
           home
           work

可以使用:

调用
prog home 
prog work 
prog -l -i1 
prog -m -i1 -i2 
prog -s

我写的代码可以制作类似的代码。

    def get_args():
        parser = argparse.ArgumentParser(prog="prog")
        group = parser.add_mutually_exclusive_group(required=True)
        group.add_argument('-l', action='store_true', help='List Mode. List available options', default=False, dest='list')
        group.add_argument('-m', action='store_true', help='Departure Mode. Return a departure time from stopcode or agency and stopname', default=False, dest='mode')
        group.add_argument('-s', action='store_true', help='Setup Mode. Enter setup mode to make a home and a work list of station codes.', default=False, dest='setup')
        group.add_argument('home', help='Display HOME_LIST') # this causes it to break because positional arguments cant be required for some reason
        group.add_argument('work', help='Display WORK_LIST')
        parser.add_argument('-i1', nargs='?', dest='i1')
        parser.add_argument('-i2', nargs='?', dest='i1')
        parser.add_argument('-i3', nargs='?', dest='i1')
        return parser.parse_args()

1 个答案:

答案 0 :(得分:1)

我会稍微清理一下:

parser = argparse.ArgumentParser(prog="prog")

group = parser.add_mutually_exclusive_group(required=True)

允许并且需要以下一个,但只有一个

group.add_argument('-l', '--list', action='store_true', 
    help='List Mode. List available options')

for' store_true'默认为False;无需定义它。给'目标'在长名称

group.add_argument('-m', '--mode', action='store_true',
   help='Departure Mode. Return a departure time from stopcode or agency and stopname')

group.add_argument('-s', '--setup', action='store_true', 
   help='Setup Mode. Enter setup mode to make a home and a work list of station codes.')

group.add_argument('home',nargs='?', default='unknown',  help='Display HOME_LIST') 

大自然需要位置参数(除非nargs='?')。所以他们不适合在mutual_required_group中。你怎么能提供其他一个论点并仍然提供这个必要的位置?

m_ex_group中只允许一个可选位置。

parser.add_argument('work', help='Display WORK_LIST')

为什么nargs='?'?从本质上讲,它们是可选的因此,如果没有给出,他们将获得默认值。 ''如果您还定义const

,则非常有用
parser.add_argument('--i1')
parser.add_argument('--i2')
parser.add_argument('--i3')

return parser.parse_args()

您可以指定位置的相对顺序。在这种情况下,work将在home之后出现。但是期权可以按任何顺序发生。所以这些--i*参数可以在任何地方出现。但这不重要。

要求-l-m以及--i1(等),需要子分析师。也就是说,您将定义类似

的内容
sp = parser.add_subparsers(dest='mode')
p0 = sp.add_parser('list')
p1 = sp.add_parser('mode')
p2 = sp.add_parser('setup')

p0.add_argument('--i1')
p0.add_argument('--i2')
...
p1.add_argument('--i1')
...

但是subparsers不能与其他位置好玩,特别是'?'的。

e.g。 argparse optional positional argument and subparsers arguments