Как правильно передать аргументы через командную строку в 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()))
Другие вопросы по тегам