Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从选项列表中解析多个位置参数?_Python_Argparse - Fatal编程技术网

Python 如何从选项列表中解析多个位置参数?

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()

我需要为新手编写一个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())
:错误:参数服务:无效选择:“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
中尝试这样做不会得到额外的分数。