std/parseopt
Источник РедактироватьЭтот модуль предоставляет стандартный парсер командной строки Nim. Он поддерживает один удобный итератор для всех параметров командной строки и некоторые функции низкого уровня.
Поддерживаемый синтаксис
Следующий синтаксис поддерживается, когда аргументы для параметров shortNoVal и longNoVal, которые описаны ниже, не предоставляются:
- Короткие опции:
-abcd,-e:5,-e=5 - Длинные опции:
--foo:bar,--foo=bar,--foo - Аргументы: всё, что не начинается с
-
Эти три типа токенов перечислены в перечислении CmdLineKind.
Когда значения опций начинаются с ':' или '=', они должны быть удвоены (как в --delim::) или чередованы (как в --delim=:).
Опция --, обычно используемая для обозначения того, что каждый последующий токен является аргументом, интерпретируется как длинная опция, и её имя — пустая строка.
Разбор
Для разбора параметров командной строки используйте OptParser. Он может быть создан с помощью initOptParser, а next продвигает парсер на один токен.
Для каждого токена поля парсера kind, key, и val предоставляют информацию об этом токене. Если токен — длинная или короткая опция, то key — имя опции, а val — либо значение опции, если оно предоставлено, либо пустая строка. Для аргументов поле key содержит сам аргумент, а val не используется. Чтобы проверить, достигнут ли конец командной строки, проверьте, равно ли kind cmdEnd.
Вот пример:
import std/parseopt
var p = initOptParser("-ab -e:5 --foo --bar=20 file.txt")
while true:
p.next()
case p.kind
of cmdEnd: break
of cmdShortOption, cmdLongOption:
if p.val == "":
echo "Option: ", p.key
else:
echo "Option and value: ", p.key, ", ", p.val
of cmdArgument:
echo "Argument: ", p.key
# Output:
# Option: a
# Option: b
# Option and value: e, 5
# Option: foo
# Option and value: bar, 20
# Argument: file.txt Итератор getopt, предоставляемый для удобства, также может использоваться для итерации по всем параметрам командной строки.
Чтобы установить значение по умолчанию для переменной, присвоенной через getopt, и принять аргументы из командной строки. Присвойте значение по умолчанию переменной перед разбором. Затем установите переменную в новое значение во время разбора.
Вот пример:
import std/parseopt
var varName: string = "defaultValue"
for kind, key, val in getopt():
case kind
of cmdArgument:
discard
of cmdLongOption, cmdShortOption:
case key:
of "varName": # --varName:<value> in the console when executing
varName = val # do input sanitization in production systems
of cmdEnd:
discard
shortNoVal и longNoVal
Необязательные параметры shortNoVal и longNoVal, присутствующие в initOptParser, предназначены для указания коротких и длинных опций, которые не принимают значения.
Когда shortNoVal не пусто, пользователям не нужно разделять короткие опции и их значения с помощью ':' или '=', поскольку парсер знает, какие опции принимают значения, а какие нет. Это поведение также применяется к длинным опциям, если longNoVal не пусто. Для коротких опций поддерживается синтаксис -j4, а для длинных опций — --foo bar. Это дополняет ранее упомянутый синтаксис. Пользователи по-прежнему могут разделять опции и их значения с помощью ':' или '=', но это становится необязательным.
По мере добавления в вашу программу больше опций, которые не принимают значения, помните о необходимости соответствующим образом изменять shortNoVal и longNoVal.
Следующий пример иллюстрирует разницу между пустым значением shortNoVal и longNoVal, которое является значением по умолчанию, и предоставлением аргументов для этих двух параметров:
import std/parseopt
proc printToken(kind: CmdLineKind, key: string, val: string) =
case kind
of cmdEnd: doAssert(false) # Doesn't happen with getopt()
of cmdShortOption, cmdLongOption:
if val == "":
echo "Option: ", key
else:
echo "Option and value: ", key, ", ", val
of cmdArgument:
echo "Argument: ", key
let cmdLine = "-j4 --first bar"
var emptyNoVal = initOptParser(cmdLine)
for kind, key, val in emptyNoVal.getopt():
printToken(kind, key, val)
# Output:
# Option: j
# Option: 4
# Option: first
# Argument: bar
var withNoVal = initOptParser(cmdLine, shortNoVal = {'c'},
longNoVal = @["second"])
for kind, key, val in withNoVal.getopt():
printToken(kind, key, val)
# Output:
# Option and value: j, 4
# Option and value: first, bar См. также
- модуль os для процедур разбора командной строки низкого уровня
- модуль parseutils для вспомогательных процедур разбора токенов, чисел, идентификаторов и т. д.
- модуль strutils для общих операций обработки строк
- модуль json для парсера JSON
- модуль parsecfg для парсера файла конфигурации
- модуль parsecsv для простого парсера CSV (значения, разделенные запятыми)
- модуль parsexml для парсера XML/HTML
- другие парсеры для других парсеров
Импорты
- strutils, os
Типы
CmdLineKind = enum cmdEnd, ## End of command line reached cmdArgument, ## An argument such as a filename cmdLongOption, ## A long option such as --option cmdShortOption ## A short option such as -c
- Обнаруженный токен командной строки. Источник Редактировать
OptParser = object of RootObj kind*: CmdLineKind ## The detected command line token key*, val*: string ## Key and value pair; the key is the option ## or the argument, and the value is not "" if ## the option was given a value-
Реализация парсера командной строки.
Для его инициализации используйте процедуру initOptParser.
Источник Редактировать
Процедуры
proc cmdLineRest(p: OptParser): string {....gcsafe, extern: "npo$1", raises: [], tags: [], forbids: [].}-
Возвращает остаток командной строки, который еще не был обработан.
См. также:
Примеры:
var p = initOptParser("--left -r:2 -- foo.txt bar.txt") while true: p.next() if p.kind == cmdLongOption and p.key == "": # Look for "--" break doAssert p.cmdLineRest == "foo.txt bar.txt"Источник Редактировать proc initOptParser(cmdline = ""; shortNoVal: set[char] = {}; longNoVal: seq[string] = @[]; allowWhitespaceAfterColon = true): OptParser {....raises: [], tags: [ReadIOEffect], forbids: [].}-
Инициализирует парсер командной строки.
Если
cmdline == "", то фактическая командная строка, предоставленная модулемos, извлекается вместо этого, если доступна. Если командная строка недоступна, будет возбуждено исключениеValueError.shortNoValиlongNoValиспользуются для указания опций, которые не принимают значения. Более подробную информацию о том, как это влияет на разбор, см. в документации по этим параметрам.Это не предоставляет способ передачи значений по умолчанию аргументам.
См. также:
Пример:
var p = initOptParser() p = initOptParser("--left --debug:3 -l -r:2") p = initOptParser("--left --debug:3 -l -r:2", shortNoVal = {'l'}, longNoVal = @["left"])Источник Редактировать proc initOptParser(cmdline: seq[string]; shortNoVal: set[char] = {}; longNoVal: seq[string] = @[]; allowWhitespaceAfterColon = true): OptParser {....raises: [], tags: [ReadIOEffect], forbids: [].}-
Инициализирует парсер командной строки.
Если
cmdline.len == 0, то фактическая командная строка, предоставленная модулемos, извлекается вместо этого, если доступна. Если командная строка недоступна, будет возбуждено исключениеValueError. Поведение других параметров остается таким же, как в initOptParser(string, ...).См. также:
Пример:
var p = initOptParser() p = initOptParser(@["--left", "--debug:3", "-l", "-r:2"]) p = initOptParser(@["--left", "--debug:3", "-l", "-r:2"], shortNoVal = {'l'}, longNoVal = @["left"])Источник Редактировать proc next(p: var OptParser) {....gcsafe, extern: "npo$1", raises: [], tags: [], forbids: [].}-
Обрабатывает следующий токен.
p.kindописывает тип обработанного токена.p.keyиp.valустанавливаются соответствующим образом.Пример:
var p = initOptParser("--left -r:2 file.txt") p.next() doAssert p.kind == cmdLongOption and p.key == "left" p.next() doAssert p.kind == cmdShortOption and p.key == "r" and p.val == "2" p.next() doAssert p.kind == cmdArgument and p.key == "file.txt" p.next() doAssert p.kind == cmdEndИсточник Редактировать proc remainingArgs(p: OptParser): seq[string] {....gcsafe, extern: "npo$1", raises: [], tags: [], forbids: [].}-
Возвращает последовательность аргументов, которые еще не были обработаны.
См. также:
Примеры:
var p = initOptParser("--left -r:2 -- foo.txt bar.txt") while true: p.next() if p.kind == cmdLongOption and p.key == "": # Look for "--" break doAssert p.remainingArgs == @["foo.txt", "bar.txt"]Источник Редактировать
Итераторы
iterator getopt(cmdline: seq[string] = @[]; shortNoVal: set[char] = {}; longNoVal: seq[string] = @[]): tuple[kind: CmdLineKind, key, val: string] {....raises: [], tags: [ReadIOEffect], forbids: [].}-
Удобный итератор для итерации по аргументам командной строки.
Это создаёт новый OptParser. Если аргументов командной строки нет, то фактическая командная строка, предоставленная модулем
os, извлекается вместо этого.shortNoValиlongNoValиспользуются для указания опций, которые не принимают значения. Более подробную информацию о том, как это влияет на разбор, см. в документации по этим параметрам.Нет необходимости проверять
cmdEndво время итерации. Если используетсяgetoptс переключением по случаям, проверка наcmdEndнеобходима.См. также:
Примеры:
# these are placeholders, of course proc writeHelp() = discard proc writeVersion() = discard var filename: string let params = @["--left", "--debug:3", "-l", "-r:2"] for kind, key, val in getopt(params): case kind of cmdArgument: filename = key of cmdLongOption, cmdShortOption: case key of "help", "h": writeHelp() of "version", "v": writeVersion() of cmdEnd: assert(false) # cannot happen if filename == "": # no filename has been written, so we show the help writeHelp()Источник Редактировать iterator getopt(p: var OptParser): tuple[kind: CmdLineKind, key, val: string] {. ...raises: [], tags: [], forbids: [].}-
Удобный итератор для итерации по предоставленному OptParser.
Нет необходимости проверять
cmdEndво время итерации. Если используетсяgetoptс переключением по случаям, проверка наcmdEndнеобходима.См. также:
Примеры:
# these are placeholders, of course proc writeHelp() = discard proc writeVersion() = discard var filename: string var p = initOptParser("--left --debug:3 -l -r:2") for kind, key, val in p.getopt(): case kind of cmdArgument: filename = key of cmdLongOption, cmdShortOption: case key of "help", "h": writeHelp() of "version", "v": writeVersion() of cmdEnd: assert(false) # cannot happen if filename == "": # no filename has been given, so we show the help writeHelp()Источник Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/parseopt.html