Python命令行参数,该参数可以为空,也可以来自选项列表

Python命令行参数,该参数可以为空,也可以来自选项列表,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,我正在编写一个脚本,用于控制Docker图像的构建。 我目前支持Centos和Debian的一个或多个基本映像。 我希望“-centos”或“-debian”默认为最新版本。 但是如果用户想要构建一个较旧的副本,那么这应该来自一个选项列表。 因此,我正在寻找一种混合的: parser.add_参数('--centos',choices=['centos-6','centos-7']) 和 parser.add_参数('--centos') 所以我可以像这样运行脚本: python-dobuild

我正在编写一个脚本,用于控制Docker图像的构建。 我目前支持Centos和Debian的一个或多个基本映像。 我希望“-centos”或“-debian”默认为最新版本。 但是如果用户想要构建一个较旧的副本,那么这应该来自一个选项列表。 因此,我正在寻找一种混合的: parser.add_参数('--centos',choices=['centos-6','centos-7']) 和 parser.add_参数('--centos')

所以我可以像这样运行脚本:

python-dobuild.py——centos将构建列表中最新的centos

python-dobuild.py--centos-centos-6#将生成较旧的副本

但是

python dobuild.py--centos centos-5#将返回一个“无效选择”错误

我尝试了
choices=['centos-6'、'centos-7'、'']
choices=['centos-6'、'centos-7'、[]

为了完整性:
python-dobuild.py--centos--debian将构建列表中最新的centos和最新的debian

等等

要使用默认值添加此可选参数,可以使用
nargs='?'
const='

请注意,对于可选参数,还有一种情况-存在选项字符串,但后面没有命令行参数。在这种情况下,将生成const的值:

使用此解析器:

>>> parser.parse_args([])
Namespace(centos=None)
>>> parser.parse_args(['--centos'])
Namespace(centos='centos-7')
>>> parser.parse_args(['--centos', 'centos-6'])
Namespace(centos='centos-6')

我不知道有哪种电池包含这种精确的语法,但它不是很好,对吧?为什么不允许使用一系列标志
--centos
--centos-6
--centos-7
,等等?这是一个不错的想法@AdamSmith需要比当前方法更详细一些,因为“有效”列表来自名为IMAGES:
解析器的字典结构。添加参数('--centos',choices=list(IMAGES['centos')].keys()),help=f“”“用于在Centos Linux上编译的映像(默认值={list(映像['Centos]]]][0]})”,required=required)
Wow@Iain Shelvington感谢您给出的精彩答案和实际代码。非常有用。
>>> parser.parse_args([])
Namespace(centos=None)
>>> parser.parse_args(['--centos'])
Namespace(centos='centos-7')
>>> parser.parse_args(['--centos', 'centos-6'])
Namespace(centos='centos-6')