标准库functools.wraps的使用方法

首先请看如下代码

  # 定义一个最简单的装饰器

  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__ == ‘__main__‘:
    print(num1.__name__)
    print(num2.__name__)

 以上代码的输出结果为:

    wrapper

    wrapper

由此函数使用装饰器时,函数的函数名即 __name__已经被装饰器改变.

一般定义装饰器的话可以不用考虑这点,但是如果多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错.

解决方案就是引入  functools.wraps  ,以上代码的解决如下:

    

    def user_login_data(f):
    @functools.wraps(f)
      def wrapper(*args, **kwargs):
        return f(*args, **kwargs)

      return wrapper

增加@functools.wraps(f), 可以保持当前装饰器去装饰的函数的 __name__ 的值不变

以上输出结果就是:

    num1

    num2

原文地址:https://www.cnblogs.com/liurenli/p/10784968.html

时间: 2024-10-11 11:00:17

标准库functools.wraps的使用方法的相关文章

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

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

Python标准库: functools (cmp_to_key, lru_cache, total_ordering, partial, partialmethod, reduce, singledispatch, update_wrapper, wraps)

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等等.

Python标准库--functools模块

functools模块:管理函数的工具 partial对象:包装原函数,提供默认值 import functools # 原函数 def myfunc(a, b=2): """Docstring for myfunc().""" print(' called myfunc with:', a, b) return # 输出函数 def show_details(name, f, is_partial=False): print(name) pri

python标准库--functools.partial

官方相关地址:https://docs.python.org/3.6/library/functools.html 一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,*args,**kw),func是必须要传入的,而且至少需要一个args或是kw参数. 创建一个功能函数,实现三个数的相加,如果其中的

C++标准库bitset类型(简单使用方法)

转自此人博客 #include<bister> using std::bitset; 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 bitset<n> b;                           //b有n位,每位都为0; bitset<n> b(u);                       //b是unsigned long型u的副本 bitset<n> b(s);                       

参考C++STL标准库中对了的使用方法

http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 当然是使用c++中的STL 的queue啦.下面简要介绍一下使用方法. 1 准备工作 头文件 #include<queue> 2 声明和定义的方法.STL的队列是泛型模板,支持任何内置和构造类型. 比如对于刚才那个牛奶问题.我把状态

JAVA用标准库自己写一个字符串翻转方法,翻转字符串中字母非单词

例如输入:I love programming 输出:I evol gnimmargorp 算法思路就是:根据空格提取每一个单词,存放在一个buffer里进行翻转处理,再添加到新的字符串.最后新的字符串就完成整个方法过程. public class ReserveString { public String reserve(String sentence){ String backS = new String(); StringBuffer temp = new StringBuffer();

php的spl_autoload标准库方法

在php5中的spl_autoload方法相当于实现自己的__autoload <?php function __autoload($classname){ if(is_file($classname.'.php'){ include $classname.'.php'; } elseif(is_file($classname.'.inc'){ include $classname.'.inc'; } } 它会在注册目录下自动寻找与$classname同名的.php/.inc文件.当然,你也可以

C++ 标准模板库STL 队列 queue 使用方法与应用介绍

C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型. 定义queue对象的示例代码如下: queue<int> q1; queue<double> q2; queue的基本操作有: 入队,如例:q.push(x); 将x接到队列的末端. 出队,如例: