Проблемы с реализацией повторяющихся элементов в docopt

Я использую docopt для анализа ввода командной строки в python. У меня есть строка документации:

"""
Usage:
  docoptTest.py [options]

Options:
  -h --help                show this help message and exit
  -n --name <name>         The name of the specified person
"""

Затем я импортирую docopt, анализирую аргументы и печатаю их:

from docopt import docopt
args = docopt(__doc__)
print(args)

>>> python docoptTest.py -n asdf
{'--help': False,
 '--name': 'asdf'}

Я попытался поставить многоточие, чтобы разрешить ввод более одного имени:

-n --name <name>...      The name of the specified person

Но я получил ошибку использования. Затем я помещаю многоточие в начальное сообщение об использовании:

"""
Usage:
  docoptTest.py [-n | --name <name>...] [options]

Options:
  -h --help                show this help message and exit
  -n --name                The name of the specified person
"""

Но вывод считает, что --name является флагом.

>>> python docoptTest.py -n asdf asdf
{'--help': False,
 '--name': True,
 '<name>': ['asdf', 'asdf']}

Как это исправить?


person polarbits    schedule 01.11.2016    source источник
comment
Ну, потому что это является флагом (точнее, опцией). А в соответствии с POSIX такая опция может иметь не более одного аргумента, а опции могут появляться в любом порядке в командной строке. Если вам нужно более одного аргумента после параметра, это нестандартно и, вероятно, может быть смоделировано с помощью позиционных элементов, хотя я не уверен, что docopt подходит для этого.   -  person SasQ    schedule 25.03.2021


Ответы (1)


Это обозначение:

>>> python docoptTest.py -n asdf asdf

вероятно, не будет работать с docopt, так как каждая опция принимает только один аргумент. Если вы хотите сделать это так, вы можете использовать какой-то разделитель, например запятую, а затем разделить его самостоятельно. Проблема возникает, если вы добавите аргумент, тогда синтаксический анализатор не сможет отличить последние asdf как часть параметра или аргумента. Некоторые люди также ставят = между параметром и его аргументом.

Возможно, вы могли бы попробовать это вместо этого:

Usage:
  docoptTest.py [-n|--name <name>]... [options]

Options:
  -h --help                show this help message and exit
  -n --name <name>         The name of the specified person

Это довольно распространенный способ сделать что-то очень похожее. Словарь docopt будет выглядеть так:

$python docoptTest.py -n asdf -n ads
{'--help': False,
 '--name': ['asdf', 'ads']}
$python docoptTest.py --name asdf --name ads
{'--help': False,
 '--name': ['asdf', 'ads']}
person J. P. Petersen    schedule 02.11.2016
comment
Спасибо. Является ли эта проблема чем-то фундаментальным (неоднозначность, будь то аргумент или значение) или есть что-то еще, что я мог бы сделать с описаниями параметров? - person polarbits; 02.11.2016
comment
Я думаю, вы не так уж много можете с этим поделать. Вы могли бы разделить его самостоятельно после этого. Вы можете сделать так, чтобы "asdf asf" считался одним аргументом, используя вокруг него ", и разделить его самостоятельно. Я думаю, что docopt соответствует спецификации Open Groups для утилит: pubs.opengroup.org/ onlinepubs/007908799/xbd/utilconv.html. Это не описывает, как обрабатывать параметры с двойным тире, но они, вероятно, обрабатываются в соответствии с передовой практикой. - person J. P. Petersen; 04.11.2016
comment
Длинные опции с двойным тире в основном являются расширениями GNU для стандарта POSIX. - person SasQ; 25.03.2021