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. ios开发之 NSObject详解

    NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Obje ...

  2. php安全

    1.会话安全性 会话固化 一种获取有效回话标识符的方法,他将运行恶意用户通过强制使用回话ID来轻松模拟一个真实用户 攻击方法:<a href="http://a.com/index.p ...

  3. ab压力测试工具的使用

    一.下载稳定版2.2.31 http://httpd.apache.org/ 二.2.2.*和2.4.*区别? httpd-2.2.x(prefork)    httpd-2.4.x(event) 编 ...

  4. byte数组存储到mysql

    public int AddVeinMessage(byte[] data)//插入数据库 { using (BCSSqlConnection = new MySqlConnection(strCon ...

  5. cestOs 7安装Jenkins

    首先到https://jenkins.io/download/下载Jenkins的war包,放在tomcat下.启动tomcat. 打开对应url.后要求输入密码. 在服务器vim .jenkins/ ...

  6. 第8章 用SQL语句操作数据

    SQL的组成: (1)DML(Data Manipiation Language ,数据操作语言,)用来插入,修改和删除数据库中的数据,如:INSERT,UPDATE,DELETE等. (2)DDL( ...

  7. wordpress站内搜索结果页URL伪静态如何操作

    站内搜索页面的优化一直被很多人忽略,只是按cms自带的默认设置,其实搜索结果页是一块宝藏,url重写是提升的重要一步.之前我们写过帝国CMS搜索页伪静态实现方法,那么,wordpress站内搜索结果页 ...

  8. finecms指定从第几篇文章开始调用5条记录,并调用文章所在栏目

    我们在建站时可能会有具体的要求,比如从第几篇文章开始调用5篇,finecms如何实现呢?用下面一段代码就能完成:num=0,5表示从第一篇开始调用5篇,注意,0代表第一,5表示调用5篇: <a ...

  9. 小程序升级实时音视频录制及播放能力,开放 Wi-Fi、NFC(HCE) 等硬件连接功能

    “ 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求.” 0 ...

  10. UIKIT_EXTERN和define定义常量

    看过我其他的博客的人都知道,我喜欢用define定义常量,最近看了一个开源的轮子,使用UIKIT_EXTERN这个定义的常量,了解了一下,发现使用宏定义的常量会在内存中临时开辟一份内存空间,而使用UI ...