我是靠谱客的博主 鲜艳早晨,最近开发中收集的这篇文章主要介绍Python高性能计算之修饰符wraps,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

修饰符functools.wraps

  其实整个functools模块都值得讲一下,我们后面会出一个专门的文章来讲。今天我们先来看下functools.wraps。

  在本节内容开始前,首先要了解什么是修饰符?可以参考我们之前整理的一篇文章。Python修饰符详解,这这篇文章中我们可以看到,修饰器的一般形式是:

def works_for_all(func):
    def inner(*args, **kwargs):
        print("I can decorate any function")
        return func(*args, **kwargs)
    return inner

@works_for_all
def ff(*args, **kwargs):
    print(args)
    print(kwargs)

如果我们此时打印ff的名字:

print(ff.__name__)
>>> inner

可以看到,由于使用了修饰符,函数的__name__属性已经被修改成了修饰器中闭包函数的名字。这样会导致什么问题呢?如果两个函数的修饰符都是works_for_all,那么这两个函数的名字就一样了。

@works_for_all
def ff2(*args, **kwargs):
    return 1

打印出两个函数的名字:

print(ff.__name__)
>>> inner
print(ff2.__name__)
>>> inner

如何解决这个问题呢?即便使用了修饰符,__name__属性应该还是保持原来的函数名,此时functools.wraps就派上用场了。

from functools import wraps
def works_for_all(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("I can decorate any function")
        return func(*args, **kwargs)
    return inner

@works_for_all
def ff(*args, **kwargs):
    print(args)
    print(kwargs)
    
@works_for_all
def ff2(*args, **kwargs):
    return 1

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

此时再打印两个函数的名字:

print(ff.__name__)
print(ff2.__name__)
>>> ff
>>> ff2

微信公众号:Quant_Times

在这里插入图片描述

最后

以上就是鲜艳早晨为你收集整理的Python高性能计算之修饰符wraps的全部内容,希望文章能够帮你解决Python高性能计算之修饰符wraps所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部