2014-09-27 96 views
1

我正在使用scopt来解析scala中的命令行参数。我希望它能够解析具有多个值的选项。例如,范围选项(如果指定)应该只有两个值。在scala中分析带有scopt的多个值的选项

--range 25 45 

的到来,从蟒蛇的背景下,我基本上是在寻找一种方式做scopt,而不是Python的argparse如下:

parser.add_argument("--range", default=None, nargs=2, type=float, 
         metavar=('start', 'end'), 
         help=(" Foo bar start and stop ")) 

我不认为minOccursmaxOccurs正好解决了我的问题,也不是关键:价值的例子在它的帮助。

+0

这种选项是不标准的(我不知道任何使用此应用程序)。由于第二个参数(例如45)预计不会与范围选项相关,因此它的可读性也较差。如果不修补scopt,我认为没有办法做到这一点。 – roterl 2014-09-27 22:36:27

回答

1

看着source code,这是不可能的。使用的Read类型类有一个成员tuplesToRead,但当您将其强制为2而不是1时,它似乎不工作。我想,您将不得不提出功能请求,或者通过使用--min 25 --max 45--range '25 45'与自定义的Read实例将此字符串拆分为两部分来解决此问题。正如@roterl指出的那样,这不是标准的解析方式。

+0

感谢您通过源代码来确定。我想我现在只需要用' - min - max'的方法。 – AnkurVj 2014-09-28 12:34:43

0

它应该是确定的,如果只有你的值与一个空格别的东西分隔的...

--range 25-45 

...尽管你需要将它们手动分割。用类似的东西解析它:

opt[String]('r', "range").action { (x, c) => 
    val rx = "([0-9]+)\\-([0-9]+)".r 
    val rx(from, to) = x 
    c.copy(from = from.toInt, to = to.toInt) 
} 
// ... 
println(s" Got range ${parsedArgs.from}..${parsedArgs.to}")