pythonic参数分析器,它会让你微笑

docopt的Python项目详细描述


docopt创建漂亮的命令行接口

视频介绍docoptPyCon 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.

如何optparseargparse生成帮助难道不是很棒吗 基于代码的消息?!

不!你知道什么是最棒的吗?这时选项解析器 根据你自己写的漂亮的帮助信息生成! 这样你就不需要编写这种愚蠢的可重复的解析器代码, 相反,只能按您希望的方式编写帮助消息–

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验证数据并向 用户。

开发

我们将love听听您对issues page

提出请求,报告错误,提出建议并讨论 docopt。您也可以将一行直接放到 <;vladimir@keleshev.com>;。

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初始版本。仅分析选项(基于选项 说明)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何在不使用java安装outlook的情况下以编程方式创建pst文件?   如何在java中比较泛型方法中的数组?   JavaFXHTML节点元素   java H2数据库要降低的连接设置无效(2019)   安卓 hilt中的java依赖循环   java这个结构什么时候有意义?   带有模式和匹配器的Java正则表达式   来自类变量的java JNI jstring?   尝试从socket读取时发生java非法阻止模式异常   绑定中使用Moxy的java接口映射。xml不能使用多个接口?   java如何仅静音来电铃声而不静音短信   下载时,java无法获取音频进度条   java SavedIntanceState。getBoolean()使我的应用程序崩溃(我想)   java图像的永久位置?   mysql Java:将多个独立脚本重构为一个脚本   在Windows上以Java访问iTunes歌词数据   java改进BaseUrl和API   为什么有必要在OSGi security中为java security manager授予所有权限