--
是说的一个方便的途径“的位置参数从这里开始”。
有了您的解析器,这些工作:
program.py refresh # sets ids=None
program.py refresh --ids 1 2 3
program.py --ids 1 2 3 -- refresh
你可以给--ids
参数默认的(例如[]),如果你不喜欢None
。
program.py refesh --ids 1,2,3
的任何问题都是由于shell如何拆分您的命令行。看看sys.argv
列表。
program.py --ids 1 2 3 refresh
问题的出现是因为处理--ids
时,解析器尝试使用所有后面不明显标记的字符串(例如用' - ')。它不使用'int'类型来测试要使用哪个和哪个要离开。现在
如果ids
是位置,它会处理1 2 3 refresh
:
parser.add_argument('ids',type=int,nargs='+')
parser.add_argument('cmd')
parser.parse_args('1 2 3 refresh'.split())
但是,这是因为解析器使用不同的策略来串分配给几个位置参数。它使用re
匹配器,看起来像A+A
。
凯文type
方法可能会用一个简单的功能得到更好的实现:
def mytype(astring):
ll = astring.split(',')
return [int(l) for l in ll]
parser.add_argument('--ids', type=mytype)
它可以被推广到处理引用的字符串,如“1 2 3”。 type
可以是接受一个字符串并返回所需值的任何函数,并且如果它不能进行转换就会产生一个错误。
您可以通过传递任意可调用的'type'来立即解析字符串,而不是稍后。 – Kevin 2015-03-13 18:07:50
@Kevin a la ['perfect_square'](https://docs.python.org/3/library/argparse.html#type)示例? – Michael 2015-03-13 18:11:44
是的,确切地说。你可以使用''operator.methodcaller('split',',')'](https://docs.python.org/3/library/operator.html#operator.methodcaller)作为你的'type',自动分配逗号。 – Kevin 2015-03-13 18:13:46