1. 认识装饰器
装饰器从字面上看似乎是一个锦上添花的功能。装饰器其实是python的一个语法糖
,本质还是一个函数,它接收一个函数作为参数,并返回一个函数。它可以在不改变原函数功能的基础上,对函数进行增强,添加额外的功能。
百度百科
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
2. 装饰器可用在哪些地方
- 给函数添加计时功能
- 对函数入参进行校验
3. 装饰器举例
需求:对函数入参进行校验
下方代码包括2个函数:
- send_msg: 模拟向用户的手机号发送短信
- phone_verification: 对函数send_msg的参数进行校验,校验不通过爆出异常;校验通过,正常运行函数。
import time
import re
def phone_verification(func):
def verification(*args, **kwargs):
# *args接收的参数是没有key=value形式的参数,例如func(1, 2, a=3),*args接收的是(1,2)
# **kwargs接收的参数是key=value形式的参数,例如func(1, 2, a=3), **kwargs接收的是{"a": 3}
phone = kwargs['phone']
name = kwargs['name']
p = re.compile('^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$')
res = re.search(p, phone)
if not res:
raise ValueError("手机号码格式错误")
if not isinstance(name, str):
raise ValueError("名字必须是字符串")
result = func(*args, **kwargs)
return result
return verification
@phone_verification
def send_msg(phone, name):
"""
向电话号码phone发送短信
:return:
"""
print(f"向{name}电话号码{phone}发送短信")
time.sleep(5)
print(f"向{name}电话号码{phone}发送短信结束")
测试装饰器是否生效:
- 输入正常参数:
send_msg(phone="18821708281", name="zhangsan")
从运行结果可以看出函数可以正常运行
- 输入异常电话号码
send_msg(phone="10012345678", name="zhangsan")
从结果可以看出装饰器对手机号码的校验生效了。
- 输出异常用户名
send_msg(phone="18812345678", name=1234)
从结果可以看出手机号验证通过了,但是名字类型输入为整型报异常了,说明装饰器参数校验是生效的。