python代码,如何解决装饰器改写函数name及doc等问题?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
已经了解了python
语言里面有关装饰器的概念,那么,本文里面要讨论的话题就是:装饰器的进阶内容,更加优美的编写一个装饰器。将要解决什么问题呢?被叠加装饰器的函数,在程序层面上,实际上被修改了__name__
和__doc__
,甚至函数入口位置__code__
也被修改了。虽然程序逻辑上并没有什么问题,但是如何才能更加优美的解决这个问题呢?
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述被叠加了装饰器的函数的__name__
和__doc__
以及__code__
问题。本文测试环境:win10
,python@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>
使用装饰器之后:
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__
及__code__
检测问题。更多python
相关经验文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。