原文地址:https://www.cnblogs.com/fcyworld/p/6239951.html

第一次见到functools.wraps是在 Flask Web开发 中,一直不明白怎么回事。

  装饰器(decorator)是干嘛的?对于受到封装的原函数来说,装饰器能够在那个函数执行前或者执行后分别运行一些代码,使得可以再装饰器里面访问并修改原函数的参数以及返回值,以实现约束定义、调试程序、注册函数等目标。装饰器一般返回一个包装器(wrapper),而functools.wraps就是装饰包装器的装饰器。

先来看一个不使用functools.wraps的装饰器例子。

 
 1 def tracer(func):
2 def wrapper(*args, **kwargs):
3 result = func(*args, **kwargs)
4 print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
5 return result
6 return wrapper
7
8 @tracer
9 def fibonacci(n):
10 if n in (0,1):
11 return n
12 return (fibonacci(n-1)+fibonacci(n-2))
13
14
15 fibonacci(3)
16 print(fibonacci)
17 print('help:')
18 help(fibonacci)
 

输出结果:

可以看到,装饰器完全可以正常工作。。。

但是,函数的名字变成装饰器中的包装器了!!!help内置函数也失效了

也就是说,原函数的属性失效了

如果想要保留原函数的属性,就可以用到functools.wraps了

 
 1 from functools import wraps
2 def tracer(func):
3 @wraps(func)
4 def wrapper(*args, **kwargs):
5 result = func(*args, **kwargs)
6 print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))
7 return result
8 return wrapper
9
10 @tracer
11 def fibonacci(n):
12 if n in (0,1):
13 return n
14 return (fibonacci(n-1)+fibonacci(n-2))
15
16
17 fibonacci(3)
18 print(fibonacci)
19 print('help:')
20 help(fibonacci)
 

输出结果:

总结一下,funtools.warps 方法的作用就是保留原函数的所有属性。

functools.wraps函数的更多相关文章

  1. 【Python】functools.wraps定义函数装饰器

    第一次见到functools.wraps是在 Flask Web开发 中,一直不明白怎么回事. 装饰器(decorator)是干嘛的?对于受到封装的原函数来说,装饰器能够在那个函数执行前或者执行后分别 ...

  2. functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数

    装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ...

  3. functools函数中的partial函数及wraps函数

    ''' partial引用函数,并增加形参 ''' import functools def show_arg(*args,**kwargs): print("args",args ...

  4. python中functools.wraps装饰器的作用

    functools.wraps装饰器用于显示被包裹的函数的名称 import functools def node(func): #@functools.wraps(func) def wrapped ...

  5. python functools.wraps装饰器模块

    # -*-coding=utf-8 -*-#实现一个函数执行后计算执行时间的功能 __author__ = 'piay' import time, functools def foo(): ''' 定 ...

  6. python functools.wraps functools.partial实例解析

    一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8 def logged(func): de ...

  7. 装饰器中的@functools.wraps的作用

    def login_required(view_func): @functools.wraps(view_func) def wrapper(*args, **kwargs): ...... retu ...

  8. python functools.wraps

    我们在使用装饰器的时候,有些函数的功能会丢失,比如func.__name__,func.__doc__,func.__module__ 比如下面这个例子: In [16]: def logged(fu ...

  9. python装饰器中functools.wraps的作用详解

    直接上代码看效果: # 定义一个最简单的装饰器 def user_login_data(f): def wrapper(*args, **kwargs): return f(*args, **kwar ...

随机推荐

  1. Eclipse - 安装lombok后注解无效

    安装 lombok lombok 的安装过程挺简单的,网上已经有很多相关的博客,这里就不在多说了,可以参考这篇:eclipse集成lombok注解不起作用 但是我按照网上的方式安装之后,注解一直不起作 ...

  2. $refs的用法及作用

    获取DOM元素,一般用document.querySelector获取这个dom节点,然后在获取input的值 但是用ref绑定之后,就不需要在获取dom节点了,直接在上面的input上绑定input ...

  3. GIL全局锁测试

    基础知识:https://www.cnblogs.com/SuKiWX/p/8804974.html 测试环境 python3.7默认解释器(cpython) cpu为四核 测试代码 #! /usr/ ...

  4. unionFS学习笔记

    AUFS基础http://coolshell.cn/articles/17061.html DOCKER对于AUFS文件系统的应用http://www.cnblogs.com/ilinuxer/p/6 ...

  5. Centos7添加新源

    yum repolist # 查看yum源列表yum localinstall http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epe ...

  6. SVN的安装与使用教程

    转载:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需 ...

  7. mysql Using filesort 索引不可用问题

        今天上班发现线上机器CPU告警,看了一下发现是mysqld一直占用CPU处于满负荷状态,show processlist;一下,发现很多查询在排序状态,随便拿了一条sql explain看了一 ...

  8. 记事本:js简介

    引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...

  9. 2018-2019-2 网络对抗技术 20165337 Exp1 PC平台逆向破解(BOF实验)

    实验内容 直接修改程序,跳转到getShell函数. 使用BOF攻击,覆盖返回地址,触发getShell函数. 注入一个自己的shellcode并运行. 任务一:直接修改程序,跳转到getShell函 ...

  10. Timeline高级扩展

    转载于http://forum.china.unity3d.com/thread-32200-1-1.html通过demo讲解了timeline更加复杂的使用方式 Timeline是创建过场动画和影片 ...