带有 docopt 的两个参数的选项
Option with two arguments with docopt
我想要一个带有两个参数的选项。 IE。希望能够使用
$ ./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"
这是 docopt 无法实现的。
项目所有者gives原因如下:
Because in invocation like prog --foo bar baz qux
there's no way for a person to tell if it means prog --foo=bar baz qux
or prog --foo=bar,baz qux
or prog --foo=bar,baz,qux
.
我觉得挺合理的。
我建议改用两个选项,可能是 --from
和 --to
,或者 --old-path
和 --new-path
。
或者,您可以使用 argparse instead, and set the nargs 选项(例如 nargs=2
)。
你可以使用click lib
http://click.pocoo.org/5/options/
@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
print('\n'.join(path))
这可以使用 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>...
我想要一个带有两个参数的选项。 IE。希望能够使用
$ ./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"
这是 docopt 无法实现的。
项目所有者gives原因如下:
Because in invocation like
prog --foo bar baz qux
there's no way for a person to tell if it meansprog --foo=bar baz qux
orprog --foo=bar,baz qux
orprog --foo=bar,baz,qux
.
我觉得挺合理的。
我建议改用两个选项,可能是 --from
和 --to
,或者 --old-path
和 --new-path
。
或者,您可以使用 argparse instead, and set the nargs 选项(例如 nargs=2
)。
你可以使用click lib http://click.pocoo.org/5/options/
@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
print('\n'.join(path))
这可以使用 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>...