2015-03-13 29 views
0

有没有更好的方法将可选的整数列表传递给​​而不是pass a delimited string and parse it later?我也有一个立场论点。通过一个可选列表来进行参数验证

parser.add_argument('--ids', type=int, nargs='+') 
parser.add_argument('cmd') 

不起作用,因为​​试图抢cmd,并抱怨说,它不是一个整数。

理想情况下,我想和

program.py --ids 6,32,12 refresh 
program.py --ids 6 32 12 refresh 

或类似的东西,也能一执行到

program.py refresh 
+1

您可以通过传递任意可调用的'type'来立即解析字符串,而不是稍后。 – Kevin 2015-03-13 18:07:50

+0

@Kevin a la ['perfect_square'](https://docs.python.org/3/library/argparse.html#type)示例? – Michael 2015-03-13 18:11:44

+0

是的,确切地说。你可以使用''operator.methodcaller('split',',')'](https://docs.python.org/3/library/operator.html#operator.methodcaller)作为你的'type',自动分配逗号。 – Kevin 2015-03-13 18:13:46

回答

2

如果你只是想分析的形式--ids 1,2,3(无空格)的参数,你可以使用这样的事情:

def convert(argument): 
    return map(int, argument.split(',')) # 3.x: consider wrapping in list() 

parser.add_argument('--ids', type=convert) 

这不会处理由空格分开的参数,虽然你也许可以减轻几分具有更智能的convert()功能。然后,您需要引用它们,否则shell会将它们作为单独的参数传递。

2

--是说的一个方便的途径“的位置参数从这里开始”。

有了您的解析器,这些工作:

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可以是接受一个字符串并返回所需值的任何函数,并且如果它不能进行转换就会产生一个错误。

相关问题