在近半年的Python命令行旅程中,我们依次学习了argparse, docopt,点击和火库的特点和用法,逐步了解到Python命令行库的设计哲学与演变。本文作为本次旅程的终点,希望从一个更高的视角对这些库进行横向对比,总结它们的异同点和使用场景,以期在应对不同场景时能够分析利弊,选择合适的库为己所用。
本系列文章默认使用Python 3作为解释器进行讲解。若你仍在使用Python 2,请注意两者之间语法和库的使用差异哦~
在讨论各个库的设计理念之前,我们先设计一个计算器程序,其实这个例子在argparse库的第一篇讲解中出现过,也就是:
-
<李>命令行程序接受一个位置参数,它能出现多次,且是数字李>
<李>默认情况下,命令行程序会求出给定的一串数字的最大值李>
<李>如果指定了选项参数总和,那么就会将求出给定的一串数字的和李>
希望从各个库实现该例子的代码中能进一步体会它们的设计理念。
<强> 2.1,argparse 强>
argparse的设计理念就是提供给你最细粒度的控制,你需要详细地告诉它参数是选项参数还是位置参数,参数值的类型是什么,该参数的处理动作是怎样的。总之时,它就像是一个没有智能分析能力的初代机器人,你需要告诉它明确的信息,它才会根据给定的信息去帮助你做事情。
以下示例为argparse实现的计算器程序:
进口argparse # 1。设置解析器 解析器=argparse。ArgumentParser(描述=计算器程序。) # 2。定义参数 #添加位置参数num,在帮助信息中显示为矿工工会 #其类型为int,且支持输入多个,且至少需要提供一个 解析器。add_argument (“num”, metavar=皀um”=int类型,娜戈=?”, 帮助=靶畹绯氐膎um”) #添加选项参数之和,该参数被解析器解析后所对应的属性名为积累 #若不提供,和默认值为马克斯函数,否则为总和函数 解析器。add_argument(',和' dest=盎邸?action=皊tore_const”, const=总和,默认=max, 帮助='和num(默认值:找到max)”) # 3。解析参数 args=解析器。parse_args([',和',' 1 ',' 2 ',' 3 ']) 打印(args) #结果:名称空间(积累=& lt;内置函数sum>, num=[1, 2, 3]) # 4。业务逻辑 结果=args.accumulate (args.nums) 打印(结果)#基于上文的[”——金额',' 1 ',' 2 ',' 3 ']参数,积累为总和函数,其结果为6
从上述示例可以看的到,我们需要通过add_argument很明确地告诉argparse参数长什么样:
-
<李>它是位置参数num,还是选项参数,和李>
<李>它的类型是什么,比如int类型=表示类型是int李>
<李>这个参数能重复出现几次,比如娜戈=' + '表示至少提供1个李>
<李>参数的是存什么的,比如action=皊tore_const”表示存常量李>
然后它才根据给定的这些元信息来解析命令行参数(也就是示例中的[”——金额',' 1 ',' 2 ',' 3 '])。
这是很计算机的思维,虽然冗长,但也带来了灵活性。
<强> 2.2,docopt 强>
从argparse的理念可以看的出,它是命令式的。这时候docopt另辟蹊径,声明式是不是也可以?一个命令行程序的帮助信息其实已然包含了这个命令行的完整元信息,那不就可以通过定义帮助信息来定义命令行? docopt就是基于这样的想法去设计的。
声明式的好处在于只要你掌握了声明式的语法,那么定义命令行的元信息就会很简单。
以下示例为docopt实现的计算器程序:
# 1。定义接口描述/帮助信息 ”““计算器程序。 用法: 计算器。py(——总和)& lt; num>… 计算器。py (- h |——帮助) 选项: - h -帮助显示帮助。 ——金额总和num(默认值:找到max)。 ”“” 从docopt进口docopt # 2。解析命令行 参数=docopt (__doc__ options_first=True, argv=[”——金额',' 1 ',' 2 ',' 3 ']) 打印(参数)#结果:{“——帮助”:假的,“,和”:真的,“& lt; num>”: [' 1 ', ' 2 ', ' 3 ']} # 3。业务逻辑 num的num=(int (num)参数[' & lt; num> ']) 如果参数[',和']: 结果=总和(num) 其他: 结果=max (num) 打印(结果)#基于上文的[”——金额',' 1 ',' 2 ',' 3 ']参数,处理函数为总和函数,其结果为6