Python装饰器之functools.wraps的作用】的更多相关文章

# -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_function @wrapper def wrapped(): pass print(wrapped.__name__) # inner_function def wrapped2(): pass print(wrapper(wrapped2).__name__) # inner_function…
在看 Bottle 代码中看见 functools.wraps 这种用法. def make_default_app_wrapper(name): """ Return a callable that relays calls to the current default app. """ a = getattr(Bottle, name) @functools.wraps(getattr(Bottle, name)) def wrapper(*…
直接上代码看效果: # 定义一个最简单的装饰器 def user_login_data(f): def wrapper(*args, **kwargs): return f(*args, **kwargs) return wrapper # 用装饰器装饰以下两个函数 @user_login_data def num1(): print("aaa") @user_login_data def num2(): print("bbbb") if __name__ == '…
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用.写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring.废话不多说,上俩栗子就能搞明白! 实例一: 不加wraps # -*- coding=utf-8 -*- from functools imp…
def login_required(view_func): @functools.wraps(view_func) def wrapper(*args, **kwargs): ...... return view_func(*args,**kwargs) return wrapper在wrapper上面使用这个装饰器可以让view_func.__name__或者view_func.__doc__访问的还是原先那个函数的对象属性.而不是装饰以后wrapper的对象属性…
不加: from functools import wraps def my_decorator(func): def wper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wper @my_decorator def example(): """Docstring""" p…
1. 何为装饰器? 官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. Python中总共包括三个内置装饰器: ① staticmethod ② classmethod ③ property 更加详细的解释,请点击(传送门) 2. 属性函数 property() 浅谈…
1.函数作用域LEGB L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间 G:global全局作用域 B:build-in内置作用域 passline = 60 def func(val): passline = 90 if val >= passline: print('pass') else: print('failed') def in_func() print(val) in_func() def Max(val1,val2): return max(val1,…
import time import hashlib import pickle import threading #装饰函数缓存应用 cache ={} def is_obsolete(entry,duration): return time.time() - entry['time']>duration def compute_key(function,args,kw): key = pickle.dumps((function.__name__,args,kw)) return hashl…
http://blog.csdn.net/yueguanghaidao/article/details/10089181…
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习python装饰器之前我们先看看这样一个例子: 一.作用域 # coding:utf-8 msg = 'hello test1' def add(): msg = 'this is add' print msg #当执行add()时将打印'this is add' def add2(): print…
最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数,这个特殊的功能就是:装饰另一个函数.举一个最简单的例子来说: def identify(f): print 'Decorator identify called.' return f 这里identify其实是一个装饰器,这个装饰器对输入的参数f不进行任何修饰,然后返回这个参数.其中的打印语句是用…
装饰器和装饰模式 先给出两者的定义: - 装饰器:装饰器是一个非常著名的设计模式,常常被用于有切面需求的场景.较为经典的有插入日志.性能測试.事务处理等. 装饰器是解决这类问题的绝佳设计.有了装饰器,我们就能够抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲.装饰器的作用就是为已经存在的对象加入额外的功能. - 装饰模式:在不必改变原类文件和使用继承的情况下.动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰器是python的高级函数应用的一个…
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Python是纯粹的自由软件,源代码和解释器CPython遵循 GPL(GNU General Public License)协议.关于python的哲学:python崇尚:"优雅"."明确"."简单",Python是用最简单最优雅最明确的方法来解决问题…
functools.wraps装饰器用于显示被包裹的函数的名称 import functools def node(func): #@functools.wraps(func) def wrapped(*args, **kwargs): print "print from node" return wrapped @node def func(): print "print from func" print func.__name__ 当没有wraps包裹时,输出的…
# -*-coding=utf-8 -*-#实现一个函数执行后计算执行时间的功能 __author__ = 'piay' import time, functools def foo(): ''' 定义一个普通函数 :return: ''' print 'this is foo' foo() ''' 这里如果我们需要查看函数执行时间,修改为: ''' def foo1(): start_time = time.clock() print 'this is foo1' end_time = tim…
第一次见到functools.wraps是在 Flask Web开发 中,一直不明白怎么回事. 装饰器(decorator)是干嘛的?对于受到封装的原函数来说,装饰器能够在那个函数执行前或者执行后分别运行一些代码,使得可以再装饰器里面访问并修改原函数的参数以及返回值,以实现约束定义.调试程序.注册函数等目标.装饰器一般返回一个包装器(wrapper),而functools.wraps就是装饰包装器的装饰器. 先来看一个不使用functools.wraps的装饰器例子. def tracer(fu…
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 functool.wraps 为我们解决了这个问题:在编写装饰器时,在实现前加入 @functools.wraps(func) 可以保证装饰器不会对被装饰函数造成影响.比如,在 Flask 中,我们要自己重写 login_required 装饰器,但不想影响被装饰器装饰的方法,则 login_req…
Python三大器之装饰器 开放封闭原则 一个良好的项目必定是遵守了开放封闭原则的,就比如一段好的Python代码必定是遵循PEP8规范一样.那么什么是开放封闭原则?具体表现在那些点? 开放封闭原则的核心的思想是软件实体是可扩展,而不可修改的. 也就是说,对扩展是开放的,而对修改是封闭的. 即使迫不得已要进行修改,也最好不要改变它原本的代码. 具体表现的点: 1.写好的项目,后期可以很方便的为其添加新的功能 2.项目修改应该尽量少的改动原本逻辑代码.而是通过某种补丁的形式完善其功能 初识装饰器…
常见装饰器:内置装饰器:类装饰器.函数装饰器.带参数的函数装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能 一.函数装饰器: def use_logging(func…
python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的docstring和名字 对此我们使用functools这个模块添加一行函数即可 @functools.wraps(f)def check_id_admin(f): '''检查是否为admin''' # 使得__name__和func_doc能够获得函数原有的docstring和函数名而不是装饰器相关的…
一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8 def logged(func): def with_logging(*args, **kwargs): '''i am wraps's doc''' print func.__name__ + " was called" return func(*args, **kwargs) return with_logging @log…
装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper #holiday = wrapper(holiday) def…
functools模块处理的对象都是其他的函数,任何可调用对象都可以被视为用于此模块的函数. 1. functools.cmp_to_key(func) 因为Python3不支持比较函数,cmp_to_key就是将老式的比较函数(comparison function)转换成关键字函数(key function),与能够接受key function的函数一起使用,比如说sorted,list.sort, min, max, heapq.nlargest, itertools.groupby等等.…
函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): i = 0 for n in args: i = i + n return i 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数: def lazy_sum(*args): def sum(): i = 0 for n in args: i = i…
wraps其实没有实际的大用处, 就是用来解决装饰器导致的原函数名指向的函数 的属性发生变化的问题: 装饰器装饰过函数func, 此时func不是指向真正的func,而是指向装饰器中的装饰过的函数 import sys debug_log = sys.stderr def trace(func): if debug_log: def callf(*args, **kwargs): """A wrapper function.""" debug_l…
我们在使用装饰器的时候,有些函数的功能会丢失,比如func.__name__,func.__doc__,func.__module__ 比如下面这个例子: In [16]: def logged(func): ...: def with_logging(*args,**kwargs): ...: print(func.__name__+" was called ") ...: return func(*args,**kwargs) ...: return with_logging ..…
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出1234,当前层级也就是作用域下必须调用函数才能引用 out1() #函数作用域 def out2(): a = 'aaa' def inner2(): a = 'bbb' print(a) inner2() print(a) out2()#当相同变量处于不同嵌套函数中,会根据作用函数由内而外查找 装饰…
1 模块简介 functools,用于高阶函数:指那些作用于函数或者返回其它函数的函数,通常只要是可以被当做函数调用的对象就是这个模块的目标. 在Python 2.7 中具备如下方法, cmp_to_key,将一个比较函数转换关键字函数: partial,针对函数起作用,并且是部分的: reduce,与python内置的reduce函数功能一样: total_ordering,在类装饰器中按照缺失顺序,填充方法: update_wrapper,更新一个包裹(wrapper)函数,使其看起来更像被…
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先来看一个简单例子: def foo():     print('i am foo') 现在有一个新的需求,希望可以记录下…