Как правильно передать аргументы через командную строку в NIM?
Я использую следующий фрагмент кода для анализа аргументов командной строки и сохранения их в таблице.
var args = initTable[string, string]()
for kind, key, val in getopt():
args.add(key,val)
Тем не менее, это работает, только если я прохожу =
в командной строке
./mytool -i=somefile.txt
В этом случае, args
является {i: somefile.txt}
, что я и хочу (пара ключ: значение).
Но если я использую ./mytool -i somefile.txt
затем args
является {somefile.txt: , i: }
, что, безусловно, не то, что я ожидал бы (два ключа и никаких значений).
Как правильно разбирать аргументы без использования =
?
Вот распечатка вида, ключа и значения в двух случаях:
$ ./diceof -a=ACTGCTGTGTGCACAGTGTCACGTGT -b=ACTGCTGTGTGCACAGTGTCACGTGa
kind:cmdShortOption
key :a
val :ACTGCTGTGTGCACAGTGTCACGTGT
kind:cmdShortOption
key :b
val :ACTGCTGTGTGCACAGTGTCACGTGa
$ ./diceof -a ACTGCTGTGTGCACAGTGTCACGTGT -b ACTGCTGTGTGCACAGTGTCACGTGa
kind:cmdShortOption
key :a
val :
kind:cmdArgument
key :ACTGCTGTGTGCACAGTGTCACGTGT
val :
kind:cmdShortOption
key :b
val :
kind:cmdArgument
key :ACTGCTGTGTGCACAGTGTCACGTGa
val :
Конечно, я мог бы проверить, если val
найден, если не добавить следующий key
как val
предыдущего. Но я ищу более элегантное решение.
1 ответ
Основываясь на документации для parseopt2 и обсуждении проблем командира(см. #10), parseopt2 может устанавливать значения для ключей только с =
или же :
Кроме того, я не знаю, есть ли "правильный" способ для анализа значений параметров.
Commandeer работает с параметрами, в которых ключ и значение разделяются пробелом, проверяя, является ли следующий токен cmdArgument, и присваивая значение.
var nextToken = cliTokens.pop()
if nextToken.kind == parseopt2.cmdArgument:
try:
assign(nextToken.key)
except ValueError:
exitWithErrorMessage(getCurrentExceptionMsg())
else:
cliTokens.add(nextToken)
argparse
кажется, единственный пакет Nim, который, наконец, поддерживает парсинг аргументов в стиле POSIX и автоматически формирует текст справки (использования) приложения:
$ ./example -c=settings.cfg
Parsed opts: (config: "settings.cfg", help: false)
$ ./example -c settings.cfg
Parsed opts: (config: "settings.cfg", help: false)
$ ./example -h
example
Usage:
example [options]
Options:
-c, --config=CONFIG Configuration file
-h, --help Show this help
Parsed opts: (config: "", help: true)
Источник:
import argparse
let p = newParser("example"):
option("-c", "--config", help="Configuration file")
echo("Parsed opts: ", p.parse(commandLineParams()))