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. elasticsearch安装IK分词插件

    一 打开网页:https://github.com/medcl/elasticsearch-analysis-ik/releases 这个是ik相关的包,找到你想下载的版本,下载对应的zip包 二 然 ...

  2. Vue中父子组件执行的先后顺序

    Vera   Vue中父子组件执行的先后顺序探讨(转载) 前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看 ...

  3. PyCharm 常用习惯设置

    1.pycharm改变选中行时改行的颜色和光标所在行的颜色 1.是光标所在行的背景颜色,写代码,每写到这一行,就会是这种颜色,所以尽量改成和你代码背景颜色相近的 2.应该是旁边行号所在背景颜色 3.是 ...

  4. 那些年读过的书《Java并发编程实战》二、如何设计线程安全类

    1.设计线程安全类的过程 设计线程安全类的过程就是设计对象状态并发访问下线程间的协同机制(在不破坏对象状态变量的不变性条件的前提下). (1)构建线程安全类的三个基本要素: 1)找出构成对象状态的所有 ...

  5. Entity Framework中IQueryable, IEnumerable, IList的区别(转载)

    原文:http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQueryable_IEnumeralb_IList_in ...

  6. MongoDB的客户端管理工具--nosqlbooster 连接MongoDB服务器

    nosqlbooster的官网地址为https://nosqlbooster.com.大家如果想直接下载,可以登入下载网址https://nosqlbooster.com/downloads. 下载w ...

  7. Laravel创建产品-CRUD之Create and Store

    上一篇说了laravel用crud之index列出产品items,我们现在试着添加产品,用到CRUD的 Create 和 Store 方法,打开/app/Http/Controllers/ItemCo ...

  8. awk命令的基本使用

    命令主要用法 -格式1:前置命令 | awk [选项] '[条件]{编辑指令}' -格式2:awk [选项] '[条件]{编辑指令}' filename 常用命令选项 -F:指定分隔符,可省略(默认空 ...

  9. SQL SERVER 2016研究五

    SQL SERVER 2016 Row Level Security 以前:SQL server 的安全模型只能针对于它的表和列, 如果要针对于行,就需要创建存储过程或者函数来处理. 如何设置这个行级 ...

  10. 如何用python发邮件

    python发送各类邮件的主要方法 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:     1.smtplib模块 smtplib.SM ...