Вариант с двумя аргументами с помощью docopt - PullRequest
0 голосов
/ 14 мая 2018

Я хочу иметь опцию, которая принимает два аргумента.Т.е. хотелось бы иметь возможность использовать

$ ./foo --path "old" "new"

Или то, что я действительно хочу, это:

$ ./foo --path "old" "new" --path "old" "new"

Но я не знаю, как это сделать?(На самом деле я боюсь, что это может быть невозможно ...)


Чего я не хочу, но что близко

Я знаю, как использовать повторяющуюся опцию (см. ниже), но это действительно не то, что я хочу здесь.

#!/usr/bin/env python3
'''foo

Usage:
  foo [--path ARG]...

Options:
  --path=ARG  Repeating option.
'''

import docopt

args = docopt.docopt(__doc__)

print(args)

Может быть вызвано с помощью

$ ./foo --path "old" --path "new"

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вы можете использовать клик lib http://click.pocoo.org/5/options/

@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
    print('\n'.join(path))
0 голосов
/ 27 мая 2018

Это может быть легко заархивировано с помощью docopt.

Синтаксис: Usage: ./foo [--path <src> <dst>]...

Ввод: ./foo --path src1 dst1 --path src2 dst2

Код:

>>> from docopt import docopt
>>> doc = "Usage: ./foo [--path <src> <dst>]..."
>>> argv = "--path old1 new1 --path old2 new2".split()
>>> args = docopt(doc, argv)

Результат:

{
  "--path": 2, 
  "<dst>": [
    "dst1", 
    "dst2"
  ], 
  "<src>": [
    "src1", 
    "src2"
  ]
}

А теперь сделайте что-нибудь с этим:

>>> if bool(args["--path"]):
>>>     n = 1 if args["--path"] is True else if args["--path"]
>>>     for i in range(0, n)]:
>>>         print("{}, {}".format(args["<old>"][i], args["<new>"][i]))
src1, dst1
src2, dst2

Чтобы добавить несколько позиционных аргументов, необходимо, чтобы параметр пути и аргументы были в правильном порядке с паренами " () ".

Usage: ./foo [(--path <src> <dst>)]... <arg>...

Внимание: docopt не вызывает SystemExit в случае, если пользователь смешивает синтаксис и вводит ./foo arg --path src dst, если вы используете опции с несколькими аргументами, подобными этому. Вам придется обработать его самостоятельно или добавить еще одну (под) команду перед ним.

Usage: ./foo [(--path <src> <dst>)]... bar <arg>...
0 голосов
/ 14 мая 2018

Это невозможно сделать с помощью docopt.

Владелец проекта дает следующую причину:

Потому что при вызове, таком как prog --foo bar baz qux, у человека нет возможности сказать, означает ли это prog --foo=bar baz qux или prog --foo=bar,baz qux или prog --foo=bar,baz,qux.

что я считаю довольно разумным.

Я бы предложил вместо этого использовать два варианта, возможно --from и --to или --old-path и --new-path.

В качестве альтернативы вы можете вместо этого использовать argparse и установить параметр nargs (например, nargs=2).

...