Python 学习笔记_装饰器(decorator) 与重试(retry)

这篇文章主要是在纪录 python decorator 的学习过程,
有错或是更好的写法的话,欢迎留言讨论!!

一、装饰器 Decorator

装饰器可以帮助我们更加精简我们的程序码,举凡 Flask、FastAPI 等 module 都有使用
更加详细的介绍可以参考 这个网址

二、简单范例

def demo_decorator(callback):
    def add():
        print("测试装饰器")
        
        # 测试用内容,会印出累加
        tmp = 0
        for i in range(10):
            tmp += i
        print(tmp)
        
        # 呼叫 callback 也就是带有装饰器的函式本身
        callback()
    
    # 规定要回传装饰器内的函式
    return add


@demo_decorator
def demo_main_function():
    print("测试函式")


if __name__ == '__main__':
    demo_main_function()
  • 执行顺序:
  1. 当被执行的函示带有装饰器的时候,会先执行装饰器中的程序
  2. 进入该装饰器内後,会先印出 "测试装饰器"
  3. 接着会进行 for 回圈的累加
  4. 最後回呼原本的函式执行原有函式的内容,印出 "测试函式"

三、retry decorator

在网路爬虫当中,我们常常会遇到需要重试请求的情况,碰到这种情况,我们可以利用 decorator 进行重试

(一)、建立装饰器

import requests


def retry_decorator(callback):
    def retry(url, retry_time):
        recoder = 0
        while recoder < retry_time:
            try:
                return callback(url)
            except requests.exceptions.RequestException:
                print("请求错误")
                recoder += 1
    return retry

(二)、建立函式

@retry_decorator
def demo_main_function(url):
    res = requests.get(url)
    print(res.status_code)

(三)、呼叫以及解释

if __name__ == '__main__':
    # correct url
    demo_main_function("https://google.com.tw", 3)
    print("-------------------")
    # wrong url
    demo_main_function("https://test.test.test", 3)
  • output:
C:\Users\nick\Desktop\deacorator_testt\venv\Scripts\python.exe C:/Users/nick/Desktop/deacorator_testt/main.py
200
-------------------
请求错误
请求错误
请求错误

Process finished with exit code 0
  • 解释:
  1. 当我们实际在呼叫 demo_main_function 的时候,
    实际上是在呼叫 retry_decorator 当中的 retry function,
    因此可以看到我们必须传入的参数是两个,而不是 demo_main_function 当中所定义的一个
  2. 将参数传入後,decorator 会开始记录重试的次数,并且利用 try except 来呼叫 demo_main_function,
    使程序不会中断,并於发生错误後累加 recoder 的值,直到重试次数达上限
  3. 利用正确以及不正确的网址各一个来实际测试 decorator 的效用,可以发现错误的部分会如预期重试我们想要他重试的次数

<<:  为了转生而点技能-JavaScript,day8(浅笔记-物件之浅层复制与深层复制

>>:  Java学习之路05---运算子

Day06 - 根据需求画出 Flowchart 或是 State Diagram

今天尝试将 2D RPG 角色移动模组根据规格画出 Flowchart 和 State Diagra...

Day 20 : Linux - 安装Linux的VM虚拟机part_2,如何自己手动分割硬碟?分割区跟挂载点又该如何做选择?

如标题,这篇想教大家如何自己手动分割硬碟 Windows有C槽、D槽、E槽……等,但linux没有w...

【Day 1】大纲 / 30 天的学习计画

身为一个普大的普通大学生, 实战经验少得可怜, 除了学过资工基本学科,就只会用 Python 写 L...

D23 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股成交量实作.3 }

在 KLineViewController 开出的 volumeDataSet 会在 parent ...

DAY15 - 第四个小范例 : Line股价机器人

前言 今天是铁人赛的第十五天,终於要把前两天的爬虫程序整合到LineBot了 再次说明:这里不是手把...