美文网首页
随记,保留函数元信息

随记,保留函数元信息

作者: 大梦三千秋 | 来源:发表于2020-06-22 18:23 被阅读0次

@wraps 装饰器


我们平时写函数的时候,可能会在原函数的基础上增加额外的处理,比较常见的如:日志,计时等。

这里就是我们之前提及的装饰器的运用。关于装饰器的简单使用,具体可查看下面的文章进行了解:
Python 装饰器

今天,篇幅不提及过多关于装饰器如何使用,主要说明一下,当装饰器作用在函数上,如何保留原函数的元信息。

在这里,需要用到 functools 库中 @wraps 装饰器来对底层包装函数进行注解。先编写一个计时的装饰器,示例代码如下:

# 计时装饰器
import time
from functools import wraps

def timeit(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(func.__name__, end - start)
        return res
    return wrapper

现在使用上面的装饰器来装饰一个简单的计算函数,并检查函数的元信息:

In [11]: @timeit
    ...: def count(n:int):
    ...:     """simple cacl
    ...:     """
    ...:     while n > 0:
    ...:         n -= 1
    ...:     print("complete!")
    ...:

In [12]: count(1000000)
complete!
count 0.04680013656616211

In [17]: count.__annotations__
Out[17]: {'n': int}

In [18]: count.__name__
Out[18]: 'count'

In [19]: count.__doc__
Out[19]: 'simple cacl\n    '

在这里,可以看到,当我们使用 @wraps 后,被装饰函数的元信息能够保留下。对比下,若是没有使用 @wraps 结果会怎样:

In [22]: count.__annotations__
Out[22]: {}

In [23]: count.__name__
Out[23]: 'wrapper'

In [24]: count.__doc__

此时,被装饰的函数的元信息则全部丢失了。如果希望保留被装饰函数的元信息,那么建议使用 @wraps 复制元信息。

使用 @wraps 还能够通过 __wrapped__ 去直接访问被装饰的函数:

In [27]: count.__wrapped__(1000000)
complete!

这里直接访问被装饰函数,只打印出被装饰函数的输入语句 complete!,并没有输出计时的结果。

以上就是关于 @wraps 保留函数元信息的内容。

相关文章

  • 随记,保留函数元信息

    @wraps 装饰器 我们平时写函数的时候,可能会在原函数的基础上增加额外的处理,比较常见的如:日志,计时等。 这...

  • 创建装饰器时保留函数元信息

    场景:你写了一个装饰器作用在某个函数上,但是这个函数的重要的元信息比如名字、文档字符串、注解和参数签名都丢失了 任...

  • 装饰器decorator

    @wrap保留元信息 类(class)的装饰器 继承装饰器 From:http://docs.pythontab....

  • Python函数标注

    Python函数标注是关于用户自定义函数中使用的类型的完全可选元数据信息。 函数标注以Python字典的形式存放在...

  • C++入门10 -- 友元,内部类,运算符重载

    友元 友元包含友元函数和友元类; 若将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所...

  • 第十一章 使用类(2)友元

    (二)友元 1.友元的概念 友元有三种:友元函数,友元类,友元成员函数。这里主要介绍友元函数。通过让函数成为类的...

  • C++ 友元,内部类,运算符重载

    友元 友元包括友元函数和友元类 如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所...

  • EZ | Image information and metad

    图像信息以及元数据 想要在代码编辑器中得到图像波段和其他属性信息,可以使用print()函数,然后信息就会显示在控...

  • FEniCS 中 xdmf 文件的写入与读取

    要完整地有限元空间中一个函数的完整信息,我们需要知道这个函数所在的函数空间和基函数的系数(通常称为dofs)。XD...

  • IOS中替换nslog

    NSLog函数打印信息是IOS开发中最简单的代码调试方法,但是NSLog本身的性能很差,程序发布后,不应该保留这些...

网友评论

      本文标题:随记,保留函数元信息

      本文链接:https://www.haomeiwen.com/subject/belffktx.html