设为首页 - 加入收藏 焦作站长网 (http://www.0391zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 发布 游戏 网络
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

大家都说好用的 Python 命令行库:click

发布时间:2019-11-08 02:02 所属栏目:[优化] 来源:HelloGitHub
导读:【线下技术沙龙】11月23日,多云时代开启企业业务新高度,安全如何与时俱进? 一、前言 在本系列前面几篇文章中,我们分别介绍了 argparse 和 docopt 的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse 是面向过程的,需要先设置解析器
【线下技术沙龙】11月23日,多云时代开启企业业务新高度,安全如何与时俱进?

?一、前言

在本系列前面几篇文章中,我们分别介绍了 argparse 和 docopt 的主要功能和用法。它们各具特色,都能出色地完成命令行任务。argparse 是面向过程的,需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。而 docopt 先用声明式的语法定义出参数,再过程式地解析命令行和实现业务逻辑。在一些人看来,这些方式都不够优雅。

大家都说好用的 Python 命令行库:click

而今天要介绍的 click[2] 则是用一种你很熟知的方式来玩转命令行。命令行程序本质上是定义参数和处理参数,而处理参数的逻辑一定是与所定义的参数有关联的。那可不可以用函数和装饰器来实现处理参数逻辑与定义参数的关联呢?而 click 正好就是以这种方式来使用的。

本系列文章默认使用 Python 3 作为解释器进行讲解。若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

二、介绍click

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

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

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

三、快速开始

3.1 业务逻辑

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

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

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

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

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

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

3.2 定义参数

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

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

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

  1. from?click?import?click?
  2. ?
  3. @click.command()?
  4. @click.option('--count',?default=1,?help='Number?of?greetings.')?
  5. @click.option('--name',?prompt='Your?name',?
  6. ??????????????help='The?person?to?greet.')?
  7. def?hello(count,?name):?
  8. ????...?

在上面的示例中:

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

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

3.3 代码梳理

使用 click 的方式非常简单,我们将上文的代码开元棋牌斗牛真假_开元棋牌同台以分_开元棋牌怎么回事下,以有一个更清晰的认识:

  1. #?hello.py?
  2. import?click?
  3. ?
  4. @click.command()?
  5. @click.option('--count',?default=1,?help='Number?of?greetings.')?
  6. @click.option('--name',?prompt='Your?name',?
  7. ??????????????help='The?person?to?greet.')?
  8. def?hello(count,?name):?
  9. ????"""Simple?program?that?greets?NAME?for?a?total?of?COUNT?times."""?
  10. ????for?x?in?range(count):?
  11. ????????click.echo('Hello?%s!'?%?name)?
  12. ?
  13. if?__name__?==?'__main__':?
  14. ????hello()?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章