Python 装饰器 wraps保留函数的元信息

举报
千江有水千江月 发表于 2021/07/15 21:28:30 2021/07/15
【摘要】 环境信息ModelArtsNotebook - pytorch1.4-cuda10.1-cudnn7-ubuntu18.04JupyterLab - Notebook - Conda-python3  装饰器 wraps保留函数的元信息from functools import wrapsdef func_old(f): def inner(*args,**kwargs): ...

环境信息

  • ModelArts
    • Notebook - pytorch1.4-cuda10.1-cudnn7-ubuntu18.04
      • JupyterLab - Notebook - Conda-python3

装饰器 wraps保留函数的元信息

from functools import wraps
def func_old(f):
    def inner(*args,**kwargs):
        print("start")
        f(*args,**kwargs)
        print("end")
    return inner
def func_new(f):
    @wraps(f)
    def inner(*args,**kwargs):
        print("start")
        f(*args,**kwargs)
        print("end")
    return inner
@func_old
def say_hello():
    """
    函数say_hello的说明文档
    """
    print("hello")
say_hello()

start
hello
end
# 函数say_hello的元信息放生了改变
help(say_hello)

Help on function inner in module __main__:

inner(*args, **kwargs)
@func_new
def say_world():
    """
    函数say_world的说明文档
    """
    print("world")
say_world()

start
world
end
# @wraps(f),保留了函数的元信息
help(say_world)

Help on function say_world in module __main__:

say_world()
    函数say_world的说明文档
# 解除装饰器 错误示范
say_hello = say_hello.__wrapped__

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-f9218f65494a> in <module>
      1 # 解除装饰器
----> 2 say_hello = say_hello.__wrapped__

AttributeError: 'function' object has no attribute '__wrapped__'
# 解除装饰器 
say_world = say_world.__wrapped__
say_world()

world

help

help(wraps)

Help on function wraps in module functools:

wraps(wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',))
    Decorator factory to apply update_wrapper() to a wrapper function
    
    Returns a decorator that invokes update_wrapper() with the decorated
    function as the wrapper argument and the arguments to wraps() as the
    remaining arguments. Default arguments are as for update_wrapper().
    This is a convenience function to simplify applying partial() to
    update_wrapper().

相关链接


备注

  1. 欢迎各位同学一起来交流学习心得^_^
  2. 在线课程、沙箱实验、认证、论坛和直播,其中包含了许多优质的内容,推荐了解与学习。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。