1.1装饰器的应用:参数类型检查

函数参数的检查,一定是在函数外
函数应该作为参数,传入到检查函数中
检查函数拿到函数传入的实际参数,与形参声明对比
__annotations__属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无法和字典中的声明对应。使用inspect模块
inspect模块:提供获取对象信息的函数,可以检查函数和类、类型检查
from functools import wraps
import inspect
def check(fn):
@wraps(fn)
def _check(*args,**kwargs):
sig = inspect.signature(fn)
params = sig.parameters #传入的参数是有序的字典,标识的是函数的签名
keys = list(params.keys()) #把形参的参数从字典中提取出来,利用list函数迭代出来,在利用索引取值
values = list(params.values())#把形参的参数注解的类型拿到,用list函数迭代,在利用索引取值
for k,v in enumerate(args): #args实参迭代,k可以利用在索引取值上
print('k={},v={}'.format(k,v))
if isinstance(v,values[k].annotation): #拿到参数注解的类型 eg:int or str
print("==")
for key,val in kwargs.items():
if isinstance(val,params[key].annotation):
print("==")
result = fn(*args,**kwargs)
return result
return _check
@check
def add(x,y:str)->str:
return x+y
add(x='a',y='b') #print == 'ab'

def say_hi(func):
def wrapper(*args,**kwargs):
print('hi')
ret = func(*args,**kwargs)
print('bye')
return ret
return wrapper
def say_no(func):
def wrapper(*args,**kwargs):
print('yo')
return func(*args,**kwargs) #43
# print('rock & roll')
return wrapper @say_hi # second 其次进行装饰 func = say_hi(func1) 最后执行func
@say_no # first 先进行装饰func func1 = say_no(func) say_no函数已经执行,但是return func #43这个位置没有被调用所以内层函数不执行
def func():
print('rock & roll') func() # 相当于调用 @say_hi的内层嵌套函数 '''
def say_hi(func):
def wrapper(*args,**kwargs):
print('hi')
# ret = func(*args,**kwargs)
print('yo')
# return func(*args,**kwargs)
print('rock & roll')
print('bye')
return ret
return wrapper
def say_no(func):
def wrapper(*args,**kwargs):
print('yo')
# return func(*args,**kwargs)
print('rock & roll')
return wrapper
'''
 
 

Python之装饰器的实例的更多相关文章

  1. Python的装饰器实例用法小结

    这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...

  2. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  3. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  4. 【转】Python之装饰器

    [转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...

  5. Python设计模式-装饰器模式

    装饰器模式 装饰器模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活. 代码示例 #coding:utf-8 #装饰器模式 class Beverage():   ...

  6. Python核心技术与实战——十四|Python中装饰器的使用

    我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...

  7. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  8. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  9. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

随机推荐

  1. 关于字符串的简单dp

    看这道题题目叫做魔族密码多新奇的名字点开是道字符串的dp,思考然后想出lis其实但字符串之间的比对只有循环然后其实循环爆不了,太懒点开了题解发现有人使用stl——cstring的函数了方便多了,借鉴一 ...

  2. unity 2d游戏 按y坐标排序子对象

    List<Transform> objs = new List<Transform>(); for (int i = 0; i < transform.childCoun ...

  3. JS实现倒计时(天数,时,分,秒)

    <!DOCTYPE html> <html> <head>   <meta charset="utf-8" >   <titl ...

  4. Ubuntu 远程挂载windows的分区

    1.首先需要将windows需要挂载的分区设置为共享 2.在Ubuntu终端输入如下命令: sudo mount -t cifs -o username=***,password=*** //172. ...

  5. [资料] Ceph存储系统,关于Redhat和Suse企业版存储知识汇总

    版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/81117091 wx_f ...

  6. select 数字/字符串/count(参数)/sum(数字) from table

    第一种的写法是增加临时列,每行的列值是写在select后的数: --1select 1 from W_EC_PLACESTATION_COLLECT t--2select 2 from W_EC_PL ...

  7. [php] 索引数组合并选择两数组相加

    header("Content-Type:text/html;charset=utf-8");$arr1= Array ( 0 => Array ( 'pic' => ...

  8. 利用 SPL 快速实现 Observer 设计模式

    目录: 1.什么是 SPL 2.SplSubject 和 SplObserver 接口 3.为什么使用 SplObjectStorage 类 4.模拟案例 5.结束语 6.下载资源 什么是 SPL S ...

  9. [js]纯css强制不换行

    要加在li上 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  10. DS1-2

    #include <stdio.h> void PrintN_1(int i, int N); void PrintN_2(int i); int main() { int n; scan ...