Docopt是否接受中间的多个参数?
我想让我的脚本能够像“cp”命令那样接受命令行参数:
'''
Usage:
cp.py <source>... <directory>
cp.py -t <directory> <source>...
cp.py -s <source>... -t <directory>
'''
这些命令行
$ python cp.py src/path/1 src/path/2 target/path
$ python cp.py -t target/path src/path/1 src/path/2
$ python cp.py -s src/path/1 src/path/2 -t target/path
会得到相同的结果:
{'<source>':['src/path/1', 'src/path/2'],'<directory>': 'target/path'}
非常感谢你们!对我的英语不好表示抱歉:)
2 个回答
2
目前不支持
你并不是唯一一个希望有这种功能的人,可以看看 docopt 的问题 #190 重复的位置参数后面跟一个单独的位置参数
重复参数后跟选项的模糊性
在重复的位置参数后面加选项会让解析变得模糊。想象一下,如果有一个文件的名字和命令选项相同,你该怎么指定它?你期待的结果是什么呢?
提议的替代方案(改变命令行设计)
我假设你希望把目标目录放在最后,这样对用户来说更直观。
带值的重复选项
Usage:
cp.py (-s <source>)... -t <directory>
这样可以指定一个目标目录和多个源。
把重复参数放在最后
Usage:
cp.py <directory> <source>...
这样虽然打破了目标参数放在最后的偏好,但操作起来相对简单。
结论
- 目前的
docopt
不支持cp
使用的这种风格。原因之一是这并不简单,另一个原因是cp
有时太复杂,甚至会造成歧义。 - 使用重复参数后跟选项总是比较棘手,尽量避免这种情况。
- 选项应该是可选的,所以使用必需的选项与易用的命令行程序的原则相悖。
- 目前,我更倾向于把目标参数放在第一个位置,然后再跟上重复的源位置参数。
- 如果
docopt
能允许多个位置参数后面跟一组固定的位置参数,那就太好了,但目前还没有实现。