我想运行cli like myscript A B C
,它应该返回Namespace(my_attribute = ['A','B','C'])或myscript
当未指定参数时返回默认值,即Namespace(my_attribute = ['A', 'B','C','D'])
这可能吗?
我现在有以下内容。
parser.add_argument(
dest='my_attribute',
choices=('A', 'B', 'C', 'D'),
nargs='*',
default=['A', 'B', 'C', 'D'],
)
**编辑
例如:这可行,但是我必须-attr
在A B之前指定。我不想使用-attr
parser.add_argument(
'-attr',
dest='my_attribute',
choices=['A','B', 'C', 'D'],
nargs='+',
default=['A','B', 'C', 'D'],
您收到什么错误消息?
当我尝试您的代码时,我得到:
错误:参数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
补丁程序,因此我不希望很快见到此修复程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句