我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

已经了解了python语言里面有关装饰器的概念,那么,本文里面要讨论的话题就是:装饰器的进阶内容,更加优美的编写一个装饰器。将要解决什么问题呢?被叠加装饰器的函数,在程序层面上,实际上被修改了__name____doc__,甚至函数入口位置__code__也被修改了。虽然程序逻辑上并没有什么问题,但是如何才能更加优美的解决这个问题呢?

苏南大叔:python代码,如何解决装饰器改写函数name及doc等问题? - python装饰器进阶
python代码,如何解决装饰器改写函数name及doc等问题?(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述被叠加了装饰器的函数的__name____doc__以及__code__问题。本文测试环境:win10python@3.6.8

__name__/__doc__/__code__

根据以前的文章内容,可以知道:

  • __name__表示函数的名字。
  • __doc__表示函数的说明文字。
  • __code__则表示函数的入口位置。

那么,下面的代码可以看到:

def exam(language="西班牙语"):
    ''' doc '''
    print("参加了考试1"+language)
print(exam.__name__, exam.__doc__)
print(exam.__code__)

输出是:

exam  doc 
<code object exam at 0x0000017B0A3848A0, file "c:/Users/sunan/Desktop/py/test.py", line 1>

苏南大叔:python代码,如何解决装饰器改写函数name及doc等问题? - 被改写的属性
python代码,如何解决装饰器改写函数name及doc等问题?(图3-2)

使用装饰器之后:

def examination(func):
    def anyname(*args, **kwargs):
        ''' anydoc '''
        print("准备参加考试1")
        func(*args, **kwargs)
        print("通过考试拿到证书1")
    return anyname
@examination
def exam(language="西班牙语"):
    ''' doc '''
    print("参加了考试1"+language)
print(exam.__name__, exam.__doc__)
print(exam.__code__)

输出是:

anyname  anydoc
<code object anyname at 0x000002D064E248A0, file "c:/Users/sunan/Desktop/py/test.py", line 2>

叠加了装饰器后,三个值都发生了变化。其中,__name____doc__被错误的修改成了装饰器里面的函数的相关值。而__code__则也被定位到了装饰器里面的相关函数的位置。

苏南大叔认为:

  • __name____doc__显示的错误的,需要进行修改。
  • __code__显示定位到装饰器里面,则是正确的。

那么,如何解决这个虽然是问题,但是并不影响装饰器逻辑的问题呢?python官方给出了答案。

wraps

利用wraps代码可以对装饰器的代码再进行改造。主要修改点就是:

  • 引入代码from functools import wraps
  • 然后对装饰器里面的函数进行 @wraps(func)改造。
from functools import wraps
def examination2(func):
    @wraps(func)
    def anyname2(*args, **kwargs):
        ''' anydoc2 '''
        print("准备参加考试2")
        func(*args, **kwargs)
        print("通过考试拿到证书2")
    return anyname2
@examination2
def exam(language="西班牙语"):
    ''' doc '''
    print("参加了考试2"+language)
print(exam.__name__, exam.__doc__)
print(exam.__code__)

修改后的代码,再检测相关的__name____doc__之后,都会显示正确的内容了。

苏南大叔:python代码,如何解决装饰器改写函数name及doc等问题? - 装饰器加wraps
python代码,如何解决装饰器改写函数name及doc等问题?(图3-3)

相关链接

综述

本文描述了python的装饰器的__name____doc____code__检测问题。更多python相关经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python