装饰器,functools,参数注解

装饰器(无参)
? 它是一个函数
? 函数作为它的形参
? 返回值也是一个函数
装饰器和高阶函数
? 装饰器是高阶函数,但装饰器是对传入函数的功能的装饰(功能增强)
带参装饰器
? 它是一个函数
? 函数作为它的形参
? 返回值是一个不带参的装饰器函数
? 使用@functionname(参数列表)方式调用
? 可以看做在装饰器外层又加了一层函数
函数注解
? Python 3.5引入
? 对函数的参数进行类型注解
? 对函数的返回值进行类型注解
? 只对函数参数做一个辅助的说明,并不对函数参数进行类型检查
? 提供给第三方工具,做代码分析,发现隐藏的bug
? 函数注解的信息,保存在annotations属性中
函数参数类型检查
? 思路
? 函数参数的检查,一定是在函数外
? 函数应该作为参数,传入到检查函数中
? 检查函数拿到函数传入的实际参数,与形参声明对比
? annotations属性是一个字典,其中包括返回值类型的声明。假设要做位置参数的判断,无
法和字典中的声明对应。使用inspect模块
inspet模块
? 提供获取对象信息的函数,可以检查函数和类、类型检查
signature(callable),获取签名(函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息)
? inspect.isfunction(add),是否是函数
? inspect.ismethod(add)),是否是类的方法
? inspect.isgenerator(add)),是否是生成器对象
? inspect.isgeneratorfunction(add)),是否是生成器函数
? inspect.isclass(add)),是否是类
? inspect.ismodule(inspect)),是否是模块
? inspect.isbuiltin(print)),是否是内建对象
Parameter对象
? 保存在元组中,是只读的
? name,参数的名字
? annotation,参数的注解,可能没有定义
? default,参数的缺省值,可能没有定义
? empty,特殊的类,用来标记default属性或者注释annotation属性的空值
? kind,实参如何绑定到形参,就是形参的类型
functools模块
? reduce方法
? reduce方法,顾名思义就是减少
? 可迭代对象不能为空;初始值没提供就在可迭代对象中取一个元素
partial方法
? 偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一
个新的函数并返回
? 从partial生成的新函数,是对原函数的封装
lru_cache装饰器
? 通过一个字典缓存被装饰函数的调用和返回值
装饰器应用练习
? 二、写一个命令分发器
? 程序员可以方便的注册函数到某一个命令,用户输入命令时,路由到注册的函数
? 如果此命令没有对应的注册函数,执行默认函数
? 用户输入用input(">>")

原文地址:http://blog.51cto.com/13896223/2169175

时间: 2024-11-04 20:23:09

装饰器,functools,参数注解的相关文章

装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序

一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 1 #!/usr/bin/env python 2 def outer(func) : 3 def inner() : 4 print("hello") 5 print("hello") 6 print("hello") 7 r = func() 8 print(

python3 如何给装饰器传递参数

[引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数 [目标] 我们有两个函数"add_fun"."add" 其中"add_fun"已经过时.如果用户有调用这个函数的话就提示它"add_fun"已经过时并且引导 它去调用"add"

装饰器(带参数)

如果明白装饰器的原理那么带参数的装饰器就很容易理解了 代码: def s1(func): def inner(a,b): #f1=inner(a,b) 接受2个参数,然后在把2个参数传递给func(a,b) print("hello") r =func(a,b) print("word") return r return inner @s1 def f1(a,b): print(a+b) f1(20,50) 现在有个问题如果装饰的函数有的参数是1个有的是2个怎么办?

装饰器的应用-装饰器带参数和不带参数

1 #!/usr/bin/env python 2 #encoding: utf-8 3 def start_info(): 4 print ('电视剧开头曲.......') 5 print ('开始唱歌.......') 6 def end_info(): 7 print ('电视剧结束曲.......') 8 9 def filter(start_info,end_info): #接收俩函数 10 def outer(main_fun): #接收装饰的函数 11 def app(*argv

python_如何修改装饰器中参数?

案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改timeout的值 如何解决这个问题? 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息 在包裹函数中添加一个函数,通过这个函数来修改timeout变量 在python3中用nonlocal来声明嵌套作用域中的变量引用,在pyth

python学习系列之python装饰器基础(6)---装饰器加参数

一.常规的装饰器,比如 @auth,执行2步操作: 1.执行auth函数,并传参func进来 2.获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值) 二.而带参数的装饰器,比如 @auth(before,after),则执行3步操作: 1.执行auth(before,after)这个函数,得到返回值ret(假设返回值为ret) 2.创建装饰器,获取返回值,拼接为@ret 3.相当于@auth函数的2个步骤: 1)执行ret函数 2)将ret函数的返回值

Node 注解(装饰器)(MyBatis注解版)

import TransactionMysql = require('transaction-mysql'); let pool = new TransactionMysql({ host: 'localhost', port: 3306, user: 'tujiawei', password: '123456', database: 'test' }); // 注解 function Select(sql) { return function (target, key: string, des

python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func):     def _deco():         print("before myfunc() called.")         func(

[python] 带有参数并且传递参数的装饰器

场景时这样的,我有个一大堆任务,我要给这些任务计时,入库.就需要一个带有参数的装饰器来记录任务名称, 在任务执行前和执行之后都需要记录任务当时执行的时刻. #-*- encoding=utf-8 -*- from functools import wraps def task_logging(taskname): def func_wrapper(func): @wraps(func) def return_wrapper(*args, **wkargs): # 函数通过装饰起参数给装饰器传送参

python_如何定义带参数的装饰器?

案例: 实现一个装饰器,用它来检查被装饰函数的参数类型. 需求: 装饰器可以通过函数,指明函数参数类型,进行函数调用的时候,传入参数,检测到不匹配时,抛出异常 如何解决这个问题? 先要获取函数的签名,并且获得装饰器中参数,然后把函数签名和装饰器中参数对应绑定 把调用函数时候传入的参数和函数签名进行绑定 把实参和装饰器中定义的数据进行类型比较,不匹配抛出异常 #!/usr/bin/python3 from inspect import signature def check_type(*ty_ar