Python3,3行代码,自动为脚本生成命令行,我默默的收藏了。
1、引言
小云:鱼哥,请教个问题?
小鱼:可以拒绝吗?
小云:可以拒绝,反正妹子约我去按脚~
小鱼:…(我擦~~ 被攻击到软肋了…) 这个现在有时间了。
小云:确定有时间了?
小鱼:肯定的了,有啥问题,直接说吧
小云:嗯…额…确定现在可以问是吧?
小鱼:你赶紧的,什么时候变得这么墨迹了
小云:好吧,那我就不客气了
小鱼:(⊙o⊙)…
小云:我最近在写脚本,发现如果修改一个参数,就得大动干戈…有没有什么简便的方法,让我修改最少的代码,实现想要的参数…
小鱼:详细说来~
小云:嗯, 咱们直接看代码吧!
2、常规方法
定义scrape方法,爬取某网站信息,timeout设置为5秒,
代码展示
# -*- coding: utf-8 -*-
# @Time : 2022-01-28
# @Author : carl_DJ
import requests
'''
定义scrape方法,爬取某网站后返回的状态及url,timeout设置为5秒
'''
def scrape(url,timeout = 5):
resp = requests.get(url=url,timeout=timeout)
resp_url = resp.url
resp_code = resp.status_code
print(f'返回状态码:{resp_code}')
print(f'返回url:{resp_url}')
小云:如果直接调用,直接如下方式就可以,
scrape('https://blog.csdn.net/wuyoudeyuer', 5)
小云:但是,想修改参数,再调用,就需要在改代码了
小鱼:你可以用argparse,每个参数都声明一下,不就好了?
代码展示
parser = argparse.ArgumentParser(description='Scrape Function')
parser.add_argument('url', type=str,
help='an integer for the accumulator')
parser.add_argument('timeout', type=int,
help='sum the integers (default: find the max)')
if __name__ == '__main__':
args = parser.parse_args()
scrape(args.url, args.timeout)
调用的时候,就直接写:
python testscr.py https://blog.csdn.net/wuyoudeyuer 5
小云:这也是一种办法,但是,能不能再简单一点的呢?
小鱼:额…吃现成的还嫌事多… 有,上车!
3、Fire模块
3.1 模块介绍
Fire是一个很奈斯的第三方库,
- 可以快速为某个python方法或者类添加命令行的参数支持。
说以,
第一步,老规矩,安装:
pip install fire
其它安装方式,直接看这两篇:
3.2 代码示例
3.2.1 参数替换
安装完成,我们就先来一个简答的实例,
从 Hello carl_奕然 开始
示例一
# -*- coding: utf-8 -*-
# @Time : 2022-01-28
# @Author : carl_DJ
import fire
#name直接传入默认参数
def hello(name = 'Carl_奕然'):
return "Hello %s !" %name
if __name__ == '__main__':
fire.Fire(hello)
运行结果:
Hello Carl_奕然 !
结果很奈斯,也是我们想要的,
但是这是什么原理呢? 我们来一探究竟。
执行命令:
python test.py --help
展示内容:
NAME
test.py
SYNOPSIS
test.py <flags>
FLAGS
--name=NAME
Default: 'Carl_奕然'
可以看到,将 name 这个参数转化成了命令行的一个可选参数,我们可以通过 —-name 来替换 name 参数。
那么,我们就来试一下
python test.py --name DJ
运行结果:
Hello DJ !
小云:我去~~ 可以啊鱼哥,真奈斯!
小鱼:你以为的 fire就这点功能?? 来,继续!
小云:这还收不住了… 好吧,继续你的表演。
3.2.2 类支持
fire这个库,还支持对类添加命令行。
# -*- coding: utf-8 -*-
# @Time : 2022-01-28
# @Author : carl_DJ
import fire
#定义Calculator类
class Calculator(object):
#double方法
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
执行命令:
python test.py
运行结果:
NAME
test.py
SYNOPSIS
test.py COMMAND
COMMANDS
COMMAND is one of the following:
double
我们可以看到,这里它将 Calculator 这个类中的方法识别出来了,COMMAND 之一就是 double,我们再调用一次double,
执行命令:
python test.py double
运行结果:
ERROR: The function received no value for the required argument: number
Usage: test.py double NUMBER
For detailed information on this command, run:
test.py double --help
我们可以看到,报错信息,是需要传入参数
我们在调整一次,
执行命令:
python test.py double 3
运行结果
6
很奈斯,是我们想要的结果。
3.2.3 代码示例
最后,我们针对第一个scrape函数,进行修改
# -*- coding: utf-8 -*-
# @Time : 2022-01-28
# @Author : carl_DJ
import requests
import fire
'''
定义scrape方法,爬取某网站信息,timeout设置为5秒
'''
def scrape(url,timeout = 5):
resp = requests.get(url=url,timeout=timeout)
resp_url = resp.url
resp_code = resp.status_code
print(f'返回状态码:{resp_code}')
print(f'返回url:{resp_url}')
if __name__ == '__main__':
fire.Fire(scrape)
执行命令:
python test.py https://blog.csdn.net/wuyoudeyuer --timeout 5
执行结果:
返回状态码:200
返回url:https://blog.csdn.net/wuyoudeyuer
奈斯。
4、总结
写到这里,今天的分享就差不多结束了。
主要分享了fire对函数及类的修改,省去了我们修改代码的时间。
最主要的是,我们又get了一个新技能。
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO 博客专家;
- 51认证讲师;
- 金牌面试官&面试培训师;
关注我,带你学习更多更有趣的Python知识。
- 点赞
- 收藏
- 关注作者
评论(0)