zoukankan      html  css  js  c++  java
  • Python进阶:都说好用的 Python 命令行库click

    click 是一个以尽可能少的代码、以组合的方式创建优美的命令行程序的 Python 包。它有很高的可配置性,同时也能开箱即用。

    它旨在让编写命令行工具的过程既快速又有趣,还能防止由于无法实现预期的 CLI API 所产生挫败感。它有如下三个特点:

    • 任意嵌套命令
    • 自动生成帮助
    • 支持运行时延迟加载子命令

    1、业务逻辑

    首先定义业务逻辑,是不是感觉到有些难以置信呢?

    不论是 argparse 还是 docopt,业务逻辑都是被放在最后一步,但 click 却是放在第一步。细想想 click 的这种方式才更符合人的思维吧?不论用什么命令行框架,我们最终关心的就是实现业务逻辑,其它的能省则省。

    我们以官方示例为例,来介绍 click 的用法和哲学。假设命令行程序的输入是 name 和 count,功能是打印指定次数的名字。

    那么在 hello.py 中,很容易写出如下代码:

    def hello(count, name):
        """Simple program that greets NAME for a total of COUNT times."""
        for x in range(count):
            click.echo('Hello %s!' % name)

    这段代码的逻辑很简单,就是循环 count 次,使用 click.echo 打印 name。其中,click.echo 和 print 的作用相似,点击进入,免费领取python学习资料,但功能更加强大,能处理好 Unicode 和 二进制数据的情况。

    2 定义参数

    很显然,我们需要针对 count 和 name 来定义它们所对应的参数信息。

    • count 对应为命令行选项 --count,类型为数字,我们希望在不提供参数时,其默认值是 1
    • name 对应为命令行选项 --name,类型为字符串,我们希望在不提供参数时,能给人提示

    使用 click,就可以写成下面这样:

    from click import click
    
    @click.command()
    @click.option('--count', default=1, help='Number of greetings.')
    @click.option('--name', prompt='Your name',
                  help='The person to greet.')
    def hello(count, name):
    

      

    在上面的示例中:

    • 使用装饰器的方式,即定义了参数,又将之与处理逻辑绑定,这真是优雅。和 argparsedocopt 比起来,就少了一步绑定过程
    • 使用 click.command 表示 hello 是对命令的处理
    • 使用 click.option 来定义参数选项
      • 对于 --count 来说,使用 default 来指定默认值。而由于默认值是数字,进而暗示 --count 选项的类型为数字
      • 对于 --name 来说,使用 prompt 来指定未输入该选项时的提示语
      • 使用 help 来指定帮助信息

    不论是装饰器的方式、还是各种默认行为,click 都是像它的介绍所说的那样,让人尽可能少地编写代码,让整个过程变得快速而有趣。

    3 代码梳理

    使用 click 的方式非常简单,我们将上文的代码汇总下,以有一个更清晰的认识:

    # hello.py
    import click
    
    @click.command()
    @click.option('--count', default=1, help='Number of greetings.')
    @click.option('--name', prompt='Your name',
                  help='The person to greet.')
    def hello(count, name):
        """Simple program that greets NAME for a total of COUNT times."""
        for x in range(count):
            click.echo('Hello %s!' % name)
    
    if __name__ == '__main__':
        hello()

    若我们指定次数和名字:

    $ python3 hello.py --count 2 --name Eric
    Hello Eric!
    Hello Eric!

    若我们什么都不指定,则会提示输入名字,并默认输出一次:

    $ python3 hello.py
    Your name: Eric
    Hello Eric!

    我们还可以通过 --help 参数查看自动生成的帮助信息:

    Usage: hello.py [OPTIONS]
    
      Simple program that greets NAME for a total of COUNT times.
    
    Options:
      --count INTEGER  Number of greetings.
      --name TEXT      The person to greet.
      --help           Show this message and exit.
     
    

      

    小结

    click 的思路非常简单,定义处理函数,通过它的装饰器来定义参数。使用装饰器的绝妙之处就在于把定义和绑定这两个步骤合为一个步骤,使得整个过程变得如丝般顺滑。

    click 除了以 Pythonic 的方式让命令行程序的实现变得更加优雅和好用外,还提供了比 argparse 和 docopt 都要强大的功能。

  • 相关阅读:
    c++中 . 和 -> 的区别是什么?
    codeblocks中一个简单的程序的创建。
    将牛客中的代码在codeblocks中进行实现
    (全代码)输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
    解决You are using pip version 10.0.1, however version 18.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    mysql 表复制(表备份)
    Scrapy 抓取股票行情
    去哪儿网数据爬取
    用API爬取天气预报数据
    爬虫防封IP
  • 原文地址:https://www.cnblogs.com/daniumiqi/p/12076968.html
Copyright © 2011-2022 走看看