当前位置: 首页 > 后端技术 > Java

马SBJava高级互联网架构师1-7

时间:2023-04-01 19:35:15 Java

下载:马SBJava高级互联网架构师1-7班有时候我们有这样的需求:我们定义了一个Python方法,该方法接受一些参数,但是在调用的时候,我想用命令行公开这些参数。例如这里有一个抓取方法:importrequestsdefscrape(url,timeout=10):response=requests.get(url,timeout=timeout)print(response.text)复制代码这里定义了一个抓取方法,第一个参数接受url,即抓取的URL,第二个参数接受timeout,指定超时时间。调用的时候,我们可能会这样调用:scrape('https:///www.baidu.com',10)copycode如果我们要改参数,改url,那我们就得改代码对不对?所以有时候我们想使用命令行来暴露这些参数。这时候我们可能会使用argparse等库,将每个参数的作用一一声明。这很麻烦。代码如下:parser=argparse.ArgumentParser(description='ScrapeFunction')parser.add_argument('url',type=str,help='anintegerfortheaccumulator')parser.add_argument('timeout',type=int,help='sumtheintegers(default:findthemax)')ifname=='__main__':args=parser.parse_args()scrape(args.url,args.timeout)复制代码以便我们可以成功使用命令行调用这个脚本:python3main.pyhttps://www.baidu.com10你觉得复制代码很麻烦吗?argparse写起来又臭又长,想想也是费了一番功夫。Fire但是接下来我们将介绍一个库,我们只需要两行代码就可以完成上述操作。这个库的名称是Fire,它可以快速地为Python方法或类添加命令行参数支持。先来看看安装方法,直接使用pip3安装即可:pip3installfire复制代码,这样我们就可以安装了。让我们看下面的几个例子。支持第一个代码示例的方式如下:importfiredefhello(name="World"):return"Hello%s!"%nameifname=='__main__':fire.Fire(hello)复制代码这里我们定义了一个hello方法,然后接受一个name参数,默认值为World,然后输出字符串Hello加上name。然后我们导入fire库,调用它的Fire方法,传入hello方法声明,会发生什么?我们把这段代码保存为demo1.py,然后用Python3运行:python3demo1.py复制代码运行结果如下:HelloWorld!复制代码看起来没有什么不同。但是如果我们此时运行下面的命令,就可以看到一些神奇的东西:python3demo1.py--help复制代码运行结果如下:NAMEdemo1.pySYNOPSISdemo1.pyFLAGS--name=NAMEDefault:'World'复制代码可以看到,这里将name参数转换为命令行的可选参数,我们可以通过--name来交换name参数。我们试试:python3demo1.py--name123复制代码这里我们传入一个name参数123,这时候我们发现运行结果变成了下面这样:你好123!复制代码不是很方便吗?我们已经轻松地完成了命令行参数支持和交换,而无需求助于argparse。那么如果我们取消name参数的默认值呢?代码重写如下:importfiredefhello(name):return"Hello%s!"%nameifname=='__main__':fire.Fire(hello)复制代码,此时再次运行:python3demo1.py--help复制代码可以看到结果变成了如下:NAMEdemo1.pySYNOPSISdemo1.pyNAMEPOSITIONALARGUMENTSNAMENOTESPOSITIONALARGUMENTS也可以使用flags语法复制代码此时我们发现参数名变成了必选参数,我们必须在命令行中指定这个参数内容,调用就会变成下面这样命令:python3demo1.py123复制代码,运行结果还是一样。