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

其他方式安装

Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
Python3:我低调的只用一行代码,就导入Python所有库!!

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了一个新技能。

猜你喜欢

转载自blog.csdn.net/wuyoudeyuer/article/details/122711661