2014-09-27 2 views
1

Я использую scopt для анализа аргументов командной строки в scala. Я хочу, чтобы он мог анализировать параметры с несколькими значениями. Например, параметр диапазона, если указан, должен принимать ровно два значения.Параметры анализа, которые принимают более одного значения с scopt в scala

--range 25 45 

Coming из питона фона, я в основном ищу способ сделать следующее с scopt вместо argparse питона:

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

Я не думаю, что minOccurs и maxOccurs решают мою проблему точно, ни пример ключа: значение в его помощи.

+0

Этот вариант не является стандартным (я не знаю ни одного приложения, использующего это). Это также менее читаемо, так как второй аргумент (например, 45) не предполагается связанным с вариантом диапазона. Я не думаю, что есть способ сделать это, не исправляя scopt. – roterl

ответ

1

Рассматривая source code, это невозможно. Используемый класс Read имеет член tuplesToRead, но он не работает, когда вы его заставляете 2 вместо 1. Вам придется сделать запрос функции, я думаю, или обойти это, используя --min 25 --max 45 или --range '25 45' с пользовательским экземпляром Read, который разбивает эту строку на две части. Как отметил @roterl, это не стандартный способ анализа.

+0

Благодарим вас за исходный код, чтобы определить это. Наверное, я сейчас перейду с подходом '--min - max '. – AnkurVj

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}") 

 Смежные вопросы

  • Нет связанных вопросов^_^