Python 如何从选项列表中解析多个位置参数?
我需要为新手编写一个django管理命令(与django无关)。我从以下行为中获得灵感并希望:Python 如何从选项列表中解析多个位置参数?,python,argparse,Python,Argparse,我需要为新手编写一个django管理命令(与django无关)。我从以下行为中获得灵感并希望: >服务=['a',b',c'] >>>导入argparse >>>ap=argparse.ArgumentParser() >>>ap.add_参数('服务',?) >>>ap.parse_参数(''.split()) 名称空间(服务=[]) >>>ap.parse_args('ab'.split()) 命名空间(服务=['a','b']) >>>ap.parse_args('abd'.split()
>服务=['a',b',c']
>>>导入argparse
>>>ap=argparse.ArgumentParser()
>>>ap.add_参数('服务',?)
>>>ap.parse_参数(''.split())
名称空间(服务=[])
>>>ap.parse_args('ab'.split())
命名空间(服务=['a','b'])
>>>ap.parse_args('abd'.split())
:错误:参数服务:无效选择:“d”(从“a”、“b”、“c”中选择)
>>>ap.parse_args('ab.split())
:错误:参数服务:重复的选项:“b”
目前,我已经测试了几种方法,但主要的障碍是如果提供了choices=services
,nargs='*'
不再允许0个参数
ap.add_参数('services',choices=services,nargs='*'))
>>>ap.parse_参数(''.split())
用法:[-h][{a,b,c}[{a,b,c}……]
:错误:参数服务:无效选择:[](从“a”、“b”、“c”中选择)
虽然有一个工作解决方案(具有自定义类型)和一个解决方案(稍后验证),但它们感觉不太对劲。(另一个解决方案作为答案发布,但如果它存在的话,我希望看到更好的解决方案。)
(看起来“无重复”功能不是Python自带的,需要重写argparse.Action
,)
编辑:我已经放弃坚持它必须像上面的规范一样工作。解决方法要好得多。我只需添加参数('--a',dest='services',action='append'u const',const=AaaService),我的命名空间就有一个
services
attr,它包含我想要运行的所有服务类。另一个解决方案是将[]
这个文本空列表添加到选项中
ap.add_参数('services',choices=services+[[]],nargs='*'))
>>>ap.parse_参数(''.split())
名称空间(服务=[])
这是由于
nargs
生成一个空列表,并根据结果验证选项。选项
kwarg变成了['a','b','c',[]]
,这看起来很奇怪,但这就是两个选项一起工作的原因。这是一个已知问题,是对“*”位置的默认值
进行一些特殊处理的结果
在解析之后执行一些您自己的值验证没有什么错。一个通用的解析工具不能处理用户抛出的所有情况 解析后检查将是最简单的,因为您都希望处理无和重复。在argparse
中尝试这样做不会得到额外的分数。