装饰器函数的运用

“”"
1、现有有如下功能函数:

def work(a,b):
    res = a/b
    print('a除B的结果为:',res)

调用函数当参数b为0的时候,work执行会报错!如:work(10,0)

需求:在不更改函数代码的前提现,实现调用work函数传入参数b为0时,函数不报错,输出结果:参数b不能为零

import time
from functools import wraps


def work_warn(func):
    def wrapper(a, b):
        if b == 0:
            print("参数b不能为零")
        else:
            result = func(a, b)
            return result

    return wrapper


@work_warn
def work(a, b):
    res = a / b
    print('a除B的结果为:', res)

2、实现一个重运行的装饰器,可以用来装饰任何一个功能函数,只要被装饰的函数执行出现AssertionError,
则重新执行该函数,同一个函数最多重运行三次。

def retry_run(func):
    def wrapper(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except AssertionError:
            count = 3
            while count:
                try:
                    func(*args, **kwargs)
                except AssertionError:
                    print("重试")
                count -= 1

    return wrapper

3、编写一个鉴权装饰器,调用被装饰的函数时,需要校验用户是否登录,如果没有登录则需要输入账号,
输入密码进行登录(默认正确的账号lemonban,密码123456),

要求:只要有一个函数调用时登录成功,后续的函数都无需再输入用户名和密码

思路提示:
1、设置一个全局变量来保存是否登录的状态,
2、在装饰器中通过判断状态来决定是否要输入账号密码进行登录(登录成功之后修改登录状态)

login_status = 0


def authentication(func):
    def wrapper(*args, **kwargs):
        global login_status
        print("login_status:", login_status)
        if not login_status:
            user = input("请输入账号:")
            passwd = input("请输入密码:")
            if user == "lemonban" and passwd == '123456':
                print(f"用户{user}登录成功")
                login_status = 1
        res = func(*args, **kwargs)
        return res

    return wrapper

4、(面试笔试题)请设计一个装饰器,接收一个int类型的参数number,可以用来装饰任何的函数,
如果函数运行的时间大于number,则打印出函数名和函数的运行时间

def run_time(number: int):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            if (end_time - start_time) > number:
                print("函数名:", func.__name__)
                print("运行时间:", end_time - start_time)
            return result

        return wrapper

    return decorator
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值