Кратность опций с docopt

Я хотел бы использовать docopt для синтаксического анализа командной строки, которая может получать одну и ту же опцию несколько раз. Может ли кто-нибудь объяснить мне, как это сделать?

Пример теста:

#!/usr/bin/env python

"""
Test program.

Usage:
    test.py -v

Options:
    -v  Flag that should be counted
"""

import docopt
print docopt.docopt(__doc__)

Если я запускаю это с test.py -v, я получаю:

{'-v': True}

Где, как если бы я запускал это с test.py -vv, он отображает сообщение об использовании (указывающее, что командная строка недействительна).

Я хотел бы настроить документацию по опциям, чтобы docopt возвращал меня:

{'-v': 1}

Когда был пройден только 1 -v и:

{'-v': 3}

Если, скажем, пользователь передал -vvv. Это почти та же функциональность, что и действие count в argparse.


person André Anjos    schedule 27.08.2013    source источник


Ответы (2)


Изучив список (закрытых) проблем docopt, я обнаружил, что правильный способ представить это будет следующим:

#!/usr/bin/env python

"""
Test program.

Usage:
    test.py (-v ...)

Options:
    -v  Flag that should be counted
"""

import docopt
print docopt.docopt(__doc__)

То есть нужно использовать символ «...», чтобы обозначить, что опция может появляться несколько раз. В этом случае опцион будет засчитан правильно. Если вышеуказанная программа вызывается с test.py -vvv, она правильно напечатает:

{'-v': 3}

Символ «...» также можно использовать с аргументами и опциями, которые принимают аргументы почти таким же образом, просто перейдите по ссылке выше, чтобы увидеть пример этого.

person André Anjos    schedule 28.08.2013
comment
И это можно расширить до передачи списка в качестве аргумента - person Kaushik Ghose; 09.05.2014
comment
@KaushikGhose Можно ли передать список следующим образом: `--input-files a.csv b.csv --output-files c.csv d.csv'? Что ты конкретно имеешь ввиду? - person The Unfun Cat; 16.09.2015
comment
@TheUnfunCat Это было бы больше похоже на: --input-files a.csv --input-files b.csv --output-files c.csv --output-files d.csv - person Kaushik Ghose; 21.09.2015
comment
Спасибо. Это означает, что подстановка невозможна (даже щелчок не позволяет использовать параметры переменной длины таким образом...) - person The Unfun Cat; 21.09.2015

(Это просто комментарий к сказанному выше, но в качестве комментария он получился бы неудобным.)

И это можно расширить до передачи списка в качестве аргумента:

"""
Usage:
program (--opt=OPT ...)

Options:
  --opt=OPT    An option that can be specified multiple times to form a list
"""

import docopt

print docopt.docopt(__doc__)

И мы запускаем это как

python test.py --opt=first_option
{'--opt': ['first_option']}

python test.py --opt=first_option --opt="second in line"
{'--opt': ['first_option', 'second in line']}

И так далее.

person Kaushik Ghose    schedule 09.05.2014