一、前言在本系列的前几篇文章中,我们分别介绍了argparse和docopt的主要功能和用法。他们每个人都有自己的特点,他们都很好地执行命令行任务。argparse是面向过程的,需要先设置解析器,然后定义参数,再解析命令行,最后实现业务逻辑。但是,docopt首先使用声明式语法来定义参数,然后程序化地解析命令行并实现业务逻辑。对某些人来说,这两种方法都不优雅。今天要介绍的click[2],就是用你熟悉的方式玩转命令行。命令行程序本质上是定义和处理参数,参数处理的逻辑必须与定义的参数相关联。能否通过函数和装饰器来实现处理参数逻辑和定义参数的关联?而click就是这么用的。本系列文章默认使用Python3作为解释器。如果你还在使用Python2,请注意两者在语法和库使用上的区别~2.简介Click是一个Python包,它以尽可能少的代码和组合的方式创建漂亮的命令行程序。它是高度可配置的,开箱即用。它旨在使编写命令行工具的过程变得快速而有趣,并防止无法实现预期的CLIAPI的挫败感。它具有以下三个特点:自动生成任意嵌套命令,有助于支持子命令的运行时延迟加载3.快速入门3.1业务逻辑首先定义业务逻辑。是不是觉得有点不可思议?不管是argparse还是docopt,业务逻辑都放在最后一步,但是click是放在第一步。想想点击的方法更符合人的思维吧?无论使用什么命令行框架,我们最终关心的是实现业务逻辑,其他的东西可以省去。下面以官方例子为例,介绍一下click的用法和原理。假设命令行程序的输入是name和count,函数是打印指定数目的名字。然后在hello.py中,很容易写出如下代码:defhello(count,name):"""SimpleprogramthatgreetsNAMEforatotalofCOUNTtimes."""forxinrange(count):click.echo('Hello%s!'%name)这段代码逻辑很简单,就是循环count次,用click.echo打印名字。其中click.echo和print类似,但是功能更强大,可以很好的处理Unicode和二进制数据。3.2定义参数显然,我们需要为count和name定义它们对应的参数信息。count对应命令行选项--count,类型为数字。我们希望在没有参数的情况下,它的默认值为1。name对应命令行选项--name,类型为字符串。我们希望在不提供参数的情况下,提示人们使用click,可以这样写:fromclickimportclick@click.command()@click.option('--count',default=1,help='Numberofgreetings.')@click.option('--name',prompt='Yourname',help='Thepersontogreet.')defhello(count,name):...在上面的例子中:使用装饰器意味着定义参数并绑定它们处理逻辑当然,那真的很优雅。与argparse和docopt相比,少了一个绑定过程。使用click.command表示hello是命令的处理。使用click.option定义参数选项。对于--count,使用default来指定默认值。由于默认值是一个数字,这意味着--count选项的类型是一个数字。对于--name,使用prompt指定不输入该选项时的提示。使用help指定帮助信息,无论是装饰器的方式还是各种默认行为,点击,正如它的介绍所说,让人写尽可能少的代码,让整个过程变得快速而有趣。3.3代码梳理click的使用方式非常简单。我们把上面的代码总结一下,让大家有个更清晰的认识:#hello.pyimportclick@click.command()@click.option('--count',default=1,help='Numberofgreetings.')@click.option('--name',prompt='Yourname',help='Thepersontogreet.')defhello(count,name):"""问候NAMEforatotalofCOUNTtimes的简单程序。"""forxinrange(count):click.echo('Hello%s!'%name)if__name__=='__main__':hello()如果我们指定了次数和名字:$python3hello.py--count2--nameEricHelloEric!HelloEric!如果我们什么都没有指定,会提示输入名字,默认输出一次:$python3hello.pyYourname:EricHelloEric!我们也可以通过--help参数查看自动生成的帮助信息:4.总结click的思路很简单,定义一个处理函数,通过它的装饰器定义参数。使用装饰器的美妙之处在于将定义和绑定两个步骤合二为一,使整个过程如丝般顺畅。click除了以Pythonic的方式让命令行程序的实现更加优雅易用之外,还提供了比argparse和docopt更强大的功能。在接下来的几节中,我们将逐步揭开它的面纱。
