pythonic参数分析器,它会让你微笑
docopt的Python项目详细描述
docopt创建漂亮的命令行接口
视频介绍docopt:PyCon UK 2012: Create *beautiful* command-line interfaces with Python
New in version 0.6.1:
- Fix issue #85 which caused improper handling of ^{tt2}$ shortcut if it was present several times.
New in version 0.6.0:
- New argument ^{tt3}$, disallows interspersing options and arguments. If you supply ^{tt4}$ to ^{tt1}$, it will interpret all arguments as positional arguments after first positional argument.
- If option with argument could be repeated, its default value will be interpreted as space-separated list. E.g. with ^{tt6}$ will be interpreted as ^{tt7}$.
Breaking changes:
- Meaning of ^{tt2}$ shortcut slightly changed. Previously it ment “any known option”. Now it means “any option not in usage-pattern”. This avoids the situation when an option is allowed to be repeated unintentionaly.
- ^{tt9}$ is ^{tt10}$ by default, not ^{tt11}$. This allows ^{tt1}$ to always use the latest ^{tt13}$, not ^{tt13}$ during import time.
如何optparse和argparse生成帮助难道不是很棒吗 基于代码的消息?!
不!你知道什么是最棒的吗?这时选项解析器是 根据你自己写的漂亮的帮助信息生成! 这样你就不需要编写这种愚蠢的可重复的解析器代码, 相反,只能按您希望的方式编写帮助消息–。
docopt帮助您创建最漂亮的命令行界面 很容易:
"""Naval Fate. Usage: naval_fate.py ship new <name>... naval_fate.py ship <name> move <x> <y> [--speed=<kn>] naval_fate.py ship shoot <x> <y> naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed=<kn> Speed in knots [default: 10]. --moored Moored (anchored) mine. --drifting Drifting mine. """fromdocoptimportdocoptif__name__=='__main__':arguments=docopt(__doc__,version='Naval Fate 2.0')print(arguments)
打败它!选项解析器是基于上面的docstring生成的 传递给docopt函数的。docopt分析用法 模式("Usage: ...")和选项描述(以行开头 使用破折号“-”,并确保程序调用与 使用模式;它根据 那。基本思想是一个好的帮助消息具有所有必需的 其中的信息用于生成解析器。
另外,PEP 257建议 将帮助消息放入模块docstrings中。
安装
使用pip或简易安装:
pip install docopt==0.6.2
或者,您可以将docopt.py文件放入 项目-它是独立的。
docopt使用python 2.5、2.6、2.7、3.2、3.3和pypypy进行测试。
API
fromdocoptimportdocopt
docopt(doc,argv=None,help=True,version=None,options_first=False)
docopt接受1个必需参数和4个可选参数:
- doc可以是模块docstring(__doc__)或其他 包含将被解析为的帮助消息的字符串 创建选项分析器。如何编写这样一个 下一节将给出帮助消息。下面是一个简单的例子 这样的字符串:
"""Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]
-h --help show this
-s --sorted sorted output
-o FILE specify output file [default: ./test.txt]
--quiet print less text
--verbose print more text
"""
argv是可选的参数向量;默认情况下,docopt使用 传递给程序的参数向量(sys.argv[1:])。 或者,您可以提供一个字符串列表,如['--verbose','-o', 'hai.txt']。
help,默认情况下True,指定解析器是否应该 自动打印帮助消息(以doc格式提供)和 如果遇到-h或--help选项,则终止 (选项应该存在于使用模式中,更多的是在下面)。如果你 要手动处理-h或--help选项(与其他选项一样 选项),设置help=False。
version,默认情况下None,是一个可选参数 指定程序的版本。如果提供,则(假设 --version选项在用法模式中提到)when parser 遇到--version选项时,它将打印提供的 版本和终止。version可以是任何可打印的对象, 但很可能是一个字符串,例如"2.1.0rc1"。
Note, when ^{tt1}$ is set to automatically handle ^{tt32}$, ^{tt33}$ and ^{tt39}$ options, you still need to mention them in usage pattern for this to work. Also, for your users to know about them.
options_first,默认情况下为False。如果设置为True将 禁止混合选项和位置参数。即在第一次之后 位置参数,所有参数都将被解释为位置参数 即使看起来像选项。这个可以用来 与posix兼容,或者如果您想分派参数 其他节目。
return值是一个包含选项、参数的简单字典 以及作为键的命令,拼写与帮助消息完全相同。长 选项的版本优先。例如,如果调用 最佳示例如下:
naval_fate.py ship Guardian move 100 150 --speed=15
返回字典为:
{'--drifting':False,'mine':False,'--help':False,'move':True,'--moored':False,'new':False,'--speed':'15','remove':False,'--version':False,'set':False,'<name>':['Guardian'],'ship':True,'<x>':'100','shoot':False,'<y>':'150'}
帮助消息格式
帮助消息由两部分组成:
使用模式,例如:
Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]
选项说明,例如:
-h --help show this -s --sorted sorted output -o FILE specify output file [default: ./test.txt] --quiet print less text --verbose print more text
其格式如下所述;其他文本将被忽略。
使用模式格式
用法模式是doc的子字符串,以 usage:(不区分大小写)m>)并以一个空行结束。 最小示例:
"""Usage: my_program.py
"""
usage:后面的第一个字被解释为程序名。 您可以多次指定程序的名称来表示 独家款式:
"""Usage: my_program.py FILE
my_program.py COUNT FILE
"""
每个模式都可以由以下元素组成:
- <;参数>;,参数。参数指定为 大写单词,例如my_program.py CONTENT-PATH或单词 被尖括号包围:^{TT54}$。
- –选项。选项是以破折号(-)开头的单词,例如。 --output,-o。你可以“叠加”一个字母中的几个 选项,例如-oiv,它将与-o-i-v相同。这个 选项可以有参数,例如--input=FILE或-i FILE或 甚至是-iFILE。但是,指定选项很重要 说明如果希望选项具有参数,则为默认值 值,或指定选项的同义短/长版本(请参见下一步 选项说明部分)。
- 命令是不遵循上述说明的单词 --options或<arguments>或ARGUMENTS的约定, 加上两个特殊命令:dash“-”和double dash“--” (见下文)。
使用以下结构指定图案:
- [](括号)可选的元素。例如:my_program.py [-hvqo FILE]
- ()(parens)必需的元素。所有not的元素 也需要输入[],例如:my_program.py --path=<path><file>...与my_program.py (--path=<path><file>...)相同。(注意,“必需选项”可能不是 对你的用户来说是个好主意)。
- (管道)互斥元素。使用^{str 1}将它们分组$( )如果需要互斥元素之一: my_program.py (--clockwise | --counter-clockwise) TIME。集团 如果没有相互排斥的元素 必需:my_program.py [--left | --right]。
- …(省略号)一个或多个元素。具体说明 可以接受任意数量的重复元素,使用 省略号(...),例如my_program.py FILE ...表示一个或 接受更多的FILE-s。如果你想接受零或更多 元素,使用方括号,例如:my_program.py [FILE ...]。省略 在左侧的表达式上用作一元运算符。
- [选项](区分大小写)任何选项的快捷方式。你可以 如果要指定使用模式可以是 提供以下选项说明中定义的任何选项 并且不想在使用模式中枚举它们。- “[--]”。惯例使用双短划线“--”分隔 可能被误认为选项的位置参数。为了 支持此约定将“[--]”添加到使用模式中。- “[-]”。按照惯例,单破折号“-”表示 stdin用于代替文件。要支持此功能,请添加“[-]” 你的使用模式。“-”作为普通命令。
如果您的模式允许匹配无参数选项(一个标志)几个 次数:
Usage: my_program.py [-v | -vv | -vvv]
然后将计算该选项的出现次数。即。 args['-v']将是2,如果程序被调用为my_program -vv。同样适用于命令。
如果使用模式允许将同一命名选项与参数匹配 或位置参数多次,匹配的参数将是 收集到列表中:
Usage: my_program.py <file> <file> --path=<path>...
即使用my_program.py file1 file2 --path=./here--path=./there调用,返回的dict将包含args['<file>'] == ['file1', 'file2']和args['--path'] == ['./here','./there']。
选项描述格式
选项描述由您放置的选项列表组成 低于你的使用模式。
必须列出选项说明才能指定:
- 同义的短和长选项,
- 如果选项有参数,
- 如果选项的参数有默认值。
规则如下:
doc中以-或--开头的每一行(不计算在内) 空格)被视为选项描述,例如:
Options: --verbose # GOOD -o FILE # GOOD Other: --bad # BAD, line does not start with dash "-"
若要指定该选项具有参数,请输入一个描述 空格后的参数(或等于“=”符号),如下所示。跟随 “<;尖括号”>;“或选项的大写约定” 论据。如果要分隔选项,可以使用逗号。在 下面的示例中,这两行都是有效的,但是建议您 坚持单一风格。
-o FILE --output=FILE # without comma, with "=" sign -i <file>, --input <file> # with comma, wihtout "=" sing
使用两个空格分隔选项及其非正式描述:
--verbose More text. # BAD, will be treated as if verbose option had # an argument "More", so use 2 spaces instead -q Quit. # GOOD -o FILE Output file. # GOOD --stdout Use stdout. # GOOD, 2 spaces
如果要为带参数的选项设置默认值, 以[default: <my-default-value>]:
--coefficient=K The K coefficient [default: 2.95] --output=FILE Output file [default: test.txt] --directory=DIR Some directory [default: ./]
如果该选项不可重复,则^{tt96}中的值$ 将作为字符串进行解释。如果可重复,则 拆分为空白列表:
Usage: my_program.py [--repeatable=<arg> --repeatable=<arg>] [--another-repeatable=<arg>]... [--not-repeatable=<arg>] # will be ['./here', './there'] --repeatable=<arg> [default: ./here ./there] # will be ['./here'] --another-repeatable=<arg> [default: ./here] # will be './here ./there', because it is not repeatable --not-repeatable=<arg> [default: ./here ./there]
示例
我们有一份examples的详细清单,其中包括 docopt功能的各个方面。试试看,看看 如有疑问,请提供来源。
子程序、多级帮助和huge应用程序(如git)
如果要将使用模式分成若干个,请实现 多级帮助(每个子命令有单独的帮助屏幕) 想要与不使用^ {STR 1 } $DOCOPT < /强>的现有脚本进行接口,或者 您正在构建下一个“git”,您将需要新的options_first 参数(如上文API部分所述)。让你快点开始 我们以git命令行接口的一个子集为例: examples/git
数据验证
docopt做了一件事并且做得很好:它实现了 命令行界面。但是它不会验证输入数据。 另一方面,有些库(如python schema)使验证数据成为 微风。看看validation_example.py 它使用schema验证数据并向 用户。
将docopt移植到其他语言
我们认为docopt非常好,我们希望在python之外共享它 社区!
以下端口可用:
但是你可以为你喜欢的语言创建一个端口!你是 鼓励使用python版本作为参考实现。一个 语言不可知测试套件与Python implementation捆绑在一起。
移植讨论是关于issues page。
更改日志
docopt跟在semantic versioning后面。这个 使用稳定api的第一个版本将是1.0.0(很快)。在那之前,你 鼓励在依赖项中显式指定版本 工具,例如:
pip install docopt==0.6.2
- 0.6.2Wheel支持。
- 0.6.1错误修复版本。
- 0.6.0options_first参数。 中断更改:更正了[options]的含义。 argv默认为None。
- 0.5.0重复的选项/命令被计算或累积到 名单。
- 0.4.2错误修复版本。
- 0.4.0选项描述变为可选, 支持“--”和“-”命令。
- 0.3.0支持(sub)命令,如git remote add。 为任何选项引入[options]快捷方式。 中断更改:docopt返回字典。
- 0.2.0使用模式匹配。基于 使用模式。 中断更改:docopt返回命名空间(用于参数),不是单子。使用模式是形式化的。
- 0.1.0初始版本。仅分析选项(基于选项 说明)。