“”"
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