我应该如何构建 argparse 来形成这个?
How should I structure the argparse to form this?
我应该如何构建 argparse 来形成这个?您应该可以呼叫 -l、-m、-s、-h、home 或 work,但不能同时呼叫两者。在使用任何 -i 之前,您应该必须先调用 -l 或 -m。
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()
我会稍微清理一下:
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')
对于'store_true'默认为False;无需定义它。给出长名中的'dest'
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='?'
)。所以它们不适合 mutually_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
不能很好地处理其他位置,尤其是 '?'一个。
例如argparse optional positional argument and subparsers arguments
我应该如何构建 argparse 来形成这个?您应该可以呼叫 -l、-m、-s、-h、home 或 work,但不能同时呼叫两者。在使用任何 -i 之前,您应该必须先调用 -l 或 -m。
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()
我会稍微清理一下:
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')
对于'store_true'默认为False;无需定义它。给出长名中的'dest'
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='?'
)。所以它们不适合 mutually_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
不能很好地处理其他位置,尤其是 '?'一个。
例如argparse optional positional argument and subparsers arguments