大家都说好用的Python命令行库click的使用
一、前言
在本系列前面几篇文章中,我们分别介绍了argparse和docopt的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse是面向过程的,需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。而docopt先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。在一些人看来,这些方式都不够优雅。
而今天要介绍的click[2]则是用一种你很熟知的方式来玩转命令行。命令行程序本质上是定义参数和处理参数,而处理参数的逻辑一定是与所定义的参数有关联的。那可不可以用函数和装饰器来实现处理参数逻辑与定义参数的关联呢?而click正好就是以这种方式来使用的。
本系列文章默认使用Python3作为解释器进行讲解。若你仍在使用Python2,请注意两者之间语法和库的使用差异哦~
二、介绍click
是一个以尽可能少的代码、以组合的方式创建优美的命令行程序的Python包。它有很高的可配置性,同时也能开箱即用。
它旨在让编写命令行工具的过程既快速又有趣,还能防止由于无法实现预期的CLIAPI所产生挫败感。它有如下三个特点:
- 任意嵌套命令
- 自动生成帮助
- 支持运行时延迟加载子命令
三、快速开始
3.1业务逻辑
首先定义业务逻辑,是不是感觉到有些难以置信呢?
不论是argparse还是docopt,业务逻辑都是被放在最后一步,但click却是放在第一步。细想想click的这种方式才更符合人的思维吧?不论用什么命令行框架,我们最终关心的就是实现业务逻辑,其它的能省则省。
我们以官方示例为例,来介绍click的用法和哲学。假设命令行程序的输入是name和count,功能是打印指定次数的名字。
那么在hello.py中,很容易写出如下代码:
defhello(count,name): """SimpleprogramthatgreetsNAMEforatotalofCOUNTtimes.""" forxinrange(count): click.echo('Hello%s!'%name)
这段代码的逻辑很简单,就是循环count次,使用click.echo打印name。其中,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来指定帮助信息
不论是装饰器的方式、还是各种默认行为,click都是像它的介绍所说的那样,让人尽可能少地编写代码,让整个过程变得快速而有趣。
3.3代码梳理
使用click的方式非常简单,我们将上文的代码汇总下,以有一个更清晰的认识:
#hello.py importclick @click.command() @click.option('--count',default=1,help='Numberofgreetings.') @click.option('--name',prompt='Yourname', help='Thepersontogreet.') defhello(count,name): """SimpleprogramthatgreetsNAMEforatotalofCOUNTtimes.""" forxinrange(count): click.echo('Hello%s!'%name) if__name__=='__main__': hello()
若我们指定次数和名字:
$python3hello.py--count2--nameEric HelloEric! HelloEric!
若我们什么都不指定,则会提示输入名字,并默认输出一次:
$python3hello.py Yourname:Eric HelloEric!
我们还可以通过--help参数查看自动生成的帮助信息:
Usage:hello.py[OPTIONS] SimpleprogramthatgreetsNAMEforatotalofCOUNTtimes. Options: --countINTEGERNumberofgreetings. --nameTEXTThepersontogreet. --helpShowthismessageandexit.
四、小结
click的思路非常简单,定义处理函数,通过它的装饰器来定义参数。使用装饰器的绝妙之处就在于把定义和绑定这两个步骤合为一个步骤,使得整个过程变得如丝般顺滑。
click除了以Pythonic的方式让命令行程序的实现变得更加优雅和好用外,还提供了比argparse和docopt都要强大的功能。在接下来几节中,我们将会逐步揭开它的面纱。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。