一、前言今天要介绍的click[2],就是用你熟悉的方式玩转命令行。命令行程序本质上是定义和处理参数,参数处理的逻辑必须与定义的参数相关联。能否通过函数和装饰器来实现处理参数逻辑和定义参数的关联?而click正是这样使用的。本系列文章默认使用Python3作为解释器。如果你还在使用Python2,请注意两者在语法和库使用上的差异~2.简介Click是一个Python包,它以尽可能少的代码组合的方式创建漂亮的命令行程序。它是高度可配置的,开箱即用。它旨在使编写命令行工具的过程变得快速而有趣,并防止无法实现预期的CLIAPI的挫败感。它具有以下三个特点:自动生成任意嵌套命令,有助于支持子命令的运行时延迟加载3.快速入门3.1业务逻辑首先定义业务逻辑。是不是觉得有点不可思议?不管是argparse还是docopt,业务逻辑都放在最后一步,click却放在第一步。想想点击的方式更符合人的思维吧?无论我们使用什么命令行框架,我们最终关心的是实现业务逻辑,能救人就救人。下面以官方例子为例,介绍一下click的用法和原理。假设命令行程序的输入是name和count,函数是打印指定数目的名字。然后在hello.py中,很容易写出如下代码:defhello(count,name):"""简单的程序,一共问候NAMECOUNT次。"""forxinrange(count):click.echo('Hello%s!'%name)这段代码的逻辑很简单,就是循环count次,用click.echo打印name。其中click.echo和print类似,但是功能更强大,可以很好的处理Unicode和二进制数据。3.2定义参数显然,我们需要为count和name定义它们对应的参数信息。count对应命令行选项--count,类型是数字,我们希望在没有提供参数的时候,它的默认值为1name对应命令行选项--name,类型是字符串,我们希望当不提供参数时,可以提醒人们使用click,可以这样写:fromclickimportclick@click.command()@click.option('--count',default=1,help='问候次数。')@click.option('--name',prompt='你的名字',help='要问候的人。')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='你的名字',help='要打招呼的人。')defhello(count,name):"""一个简单的程序,总共打招呼NAME次。"""forxinrange(count):click.echo('Hello%s!'%name)if__name__=='__main__':hello()如果我们指定次数和名称:$python3hello.py--计数2--nameEricHelloEric!HelloEric!如果我们什么都不指定,会提示输入名字,默认输出一次:$python3hello.py你的名字:Eric你好Eric!我们也可以通过--help参数查看自动生成的帮助信息:Usage:hello.py[OPTIONS]向NAME打招呼总共COUNT次的简单程序。选项:--countINTEGER问候次数。--nameTEXT要问候的人。--help显示此消息并退出。4.总结click的思路很简单,定义一个处理函数,通过它的装饰器定义参数。使用装饰器的美妙之处在于将定义和绑定两个步骤合二为一,使整个过程如丝般顺畅。click除了以Pythonic的方式让命令行程序的实现更加优雅易用之外,还提供了比argparse和docopt更强大的功能。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
