当前位置: 首页 > 科技观察

Google开源的Python命令行库:fire

时间:2023-03-13 05:35:35 科技观察

初探一、前言在本系列的前几篇文章中,我们分别介绍了argparse、docopt和click的主要功能和用法。他们每个人都有自己的特点,他们都很好地执行命令行任务。argparse是面向过程的,需要先设置解析器,然后定义参数,再解析命令行,最后实现业务逻辑。docopt首先使用声明式语法定义参数,然后程序化地解析命令行并实现业务逻辑。click使用装饰器进一步简化显式命令调用逻辑,但它仍然不是面向对象的。今天要介绍的火是用广义的面向对象的方式玩转命令行。这样的对象可以是类、函数、字典、列表等,更加灵活简单。本系列文章默认使用Python3作为解释器。如果你还在使用Python2,请注意两者在语法和库使用上的差异~2.简介Fire可以自动生成基于任何Python对象的命令行界面。它具有以下特点:可以简单地生成CLI是一个用于开发和调试Python代码的实用程序可以将现有代码或其他人的代码转换为CLI通过预置REPL使Bash和Python之间的切换更容易所需的模块和变量使其成为更易于使用REPL。fire库可以通过以下命令快速安装:pipinstallfire3.快速入门回忆一下使用argparse、docopt和click实现命令行程序的步骤:对于argparse,首先要设置解析器,然后定义参数,然后解析命令行,最后实现业务逻辑(四步)对于docopt,先定义接口描述,然后解析命令行,最后实现业务逻辑(三步)对于click,就是实现业务逻辑和通过装饰器定义参数(两步)。他们的实现步骤越来越简单,从四步到两步。今天的主角火了,只需要一步,业务逻辑就够了。这简直不可思议,为什么这就够了?让我们考虑一下Python中的函数。一个函数可以对应一个命令行程序,函数的参数可以对应命令行程序的参数和选项吗?再看看Python中的类,一个类是不是可以对应一个命令行程序,类中的每个实例方法都可以对应一个子命令,而实例方法中的参数就是子命令对应的参数和选项。这样一想,理论上确实是可以实现的。我们不妨通过下面的例子来看看fire是如何让我们以简单的方式实现命令行程序的。3.1我们来看一个使用函数的例子:importfiredefhello(name="World"):return'Hello{name}!'.format(name=name)if__name__=='__main__':fire.Fire(hello)在上面的例子中定义一个hello函数,它接受一个名称参数并具有默认值“World”。使用fire.Fire(hello)可以非常简单快速的实现命令功能。此命令行接受--name选项。如果未提供,将使用默认值“World”,如果提供,则使用提供的值。可以在命令行执行以下命令:$pythonhello.pyHelloWorld!$pythonhello.py--name=ProdesireHelloProdesire!$pythonhello.py--helpINFO:Showinghelpwiththecommand'hello.py----help'.NAMEhello.pySYNOPSIShello。pyFLAGS--name=NAME3.2使用类和函数是最简单的方法。如果我们想用更有条理的方式来实现,比如使用类,fire也支持。importfireclassCalculator(object):"""Asimplecalculatorclass."""defdouble(self,number):return2*numberdeftriple(self,number):return3*numberif__name__=='__main__':fire.Fire(Calculator)在上面的例子中,定义一个Calculator类,它有两个实例方法double和triple,接受数字参数,没有默认值。使用fire.Fire(Calculator)可以非常简单快速的实现命令功能。此命令行支持两个子命令double和triple。位置参数NUMBER或者选项参数--number可以在命令行执行如下命令:$pythoncalculator.pydouble1020$pythoncalculator.pytriple--number=1545$pythoncalculator.pydouble--helpINFO:Showinghelpwiththecommand'calculator.pydouble----help'.NAMEcalculator.pydoubleSYNOPSIScalculator.pydoubleNUMBERPOSITIONALARGUMENTSNUMBERNOTES也可以使用flagssyntaxforPOSITIONALARGUM可以说是非常Python化的,这也是它如此受欢迎的原因。除了上面展示的内容,fire还支持更多类型的Python对象,还有很多强大的功能。我们将在接下来的几节中逐步接近它。