Множество вариантов с 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 .

После того, как вы выкопали список вопросов, связанных с 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}

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

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

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

 """ 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']} 

И так далее.