python argparse选项与默认选项

python argparse选项与默认选项,python,python-3.x,argparse,Python,Python 3.x,Argparse,我试图在Python3应用程序中使用argparse,其中有一个显式的选项列表,但如果没有指定,则为默认值 我的密码是: parser.add_argument('--list', default='all', choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)') args = parser.parse_args() print(vars(args

我试图在Python3应用程序中使用argparse,其中有一个显式的选项列表,但如果没有指定,则为默认值

我的密码是:

parser.add_argument('--list', default='all', choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)') 
args = parser.parse_args()
print(vars(args))
但是,当我运行此选项时,我会得到以下选项:

$ python3 ./myapp.py --list all
{'list': 'all'}
$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument
或者没有选择权:

$ python3 ./myapp.py --list all
{'list': 'all'}
$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument

我是不是遗漏了什么?或者我可以不使用指定选项的默认值吗?

nargs
const
参数传递到
添加参数

parser.add_argument('--list',
                    default='all',
                    const='all',
                    nargs='?',
                    choices=['servers', 'storage', 'all'],
                    help='list servers, storage, or both (default: %(default)s)')

如果您想知道是否在没有参数的情况下传递了
--list
,请删除
const
参数,并检查
args.list
是否为
None
谢谢@ShadowRanger<代码>子命令正是我所需要的,与
nargs
const
结合在一起。以下工作:

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
parser_list = subparser.add_parser('list')
parser_list.add_argument('list_type', default='all', const='all', nargs='?', choices=['all', 'servers', 'storage'])

parser_create = subparser.add_parser('create')
parser_create.add_argument('create_type', default='server', const='server', nargs='?', choices=['server', 'storage'])

args = parser.parse_args()
pprint(vars(args))

$ python3 ./myapp.py -h
usage: dotool.py [-h] {list,create} ...

Digital Ocean tool

positional arguments:
  {list,create}

optional arguments:
  -h, --help     show this help message and exit
仅列出选项:

$ python3 ./myapp.py list
{'list_type': 'all'}
带有参数的列表选项:

$ python3 ./myapp.py list servers
{'list_type': 'servers'}

根本不通过
--list
,您的默认值将被使用。我明白了。。。除了我需要告诉它列出、创建、删除等等之外,这是可行的。听起来像是你想要的,根本不是开关。即使使用
nargs='?'
你也无法区分
--list
和在有默认集时不传递任何内容之间的区别。这有点奇怪,但我会使用元组而不是列表:
选项=('servers','storage','all')
原因在[(列表与元组)中讨论