我想运行像myscript A B C
这样的cli,它应返回命名空间(my_attribute = [' A',' B',' C' ])或myscript
,如果没有指定args,则返回默认值,即命名空间(my_attribute = [' A',' B',' C' ,' D'])
这可能吗?
我现在有以下内容。
parser.add_argument(
dest='my_attribute',
choices=('A', 'B', 'C', 'D'),
nargs='*',
default=['A', 'B', 'C', 'D'],
)
**修改
例如:这有效,但我必须在A B之前指定-attr
。我不想使用-attr
parser.add_argument(
'-attr',
dest='my_attribute',
choices=['A','B', 'C', 'D'],
nargs='+',
default=['A','B', 'C', 'D'],
答案 0 :(得分:0)
为什么不nargs=4
? E.g。
parser.add_argument(
dest='my_attribute',
choices=list(itertools.permutations(['A', 'B', 'C', 'D']))
nargs=4,
default=['A', 'B', 'C', 'D'],
)
请注意choces中的排列,因为您可能需要以下选项:
'A', 'B', 'C', 'D'
'A', 'D', 'C', 'B'
...
'D', 'C', 'B', 'A'
如果需要,将permutations
替换为combinations
。
答案 1 :(得分:0)
您收到了什么错误消息?
当我尝试你的代码时,我得到了:
错误:参数my_attribute:无效选择:['A','B','C','D'](从'A','B','C','D'中选择)
它正在尝试使用默认值,但它正在根据您的选择测试整个事情。您希望它根本不测试默认值,或者单独测试列表的每个元素。
如果没有choices
,*
位置确实有效。
正如我在第一个回答中所提到的,*
位置需要一些特殊处理。 *
可选不会。
kludge是使用default='A'
。这通过了选择测试。生成的命名空间将为Namespace(my_attribute='A')
。这不是预期的列表,但在解析后很容易测试和替换。
parser = argparse.ArgumentParser()
parser.add_argument(
dest='my_attribute',
choices=('A', 'B', 'C', 'D'),
nargs='*',
default='A',
)
args = parser.parse_args()
if args.my_attribute=='A':
args.my_attribute=['A', 'B', 'C', 'D']
print args
有关此主题的错误报告(几年前):
http://bugs.python.org/issue9625 'argparse:使用选项
时变量nargs的默认值出现问题有一个建议的补丁会对列表默认的每个项目执行'选择'测试。使用argparse
应该运行您的示例。但是有大量的argparse
补丁,所以我不希望很快看到这个补丁。