消除装饰器对原函数的属性影响

标签:自动化测试   ram   自动化测试框架   ima   ret   width   调用   size   fun   

 


 

首先介绍Python的"万能"装饰器模版:

import os
def decor(func):
    def with_decor(*args, **kwargs):  #这里内部嵌套函数使原函数参数能顺利传递
        func(*args, **kwargs)  #func_A 会在这里被调用
        a = args
        print(a)
    print(call decor)
    return with_decor

@decor
def func_A(*args, **kwargs):
    print(call A)
    
func_A(1,2,3)
os.system("pause")

  该程序将会输出:

  技术图片

  调用 func_A 函数会执行直接装饰器里的内容,并将参数传入闭包


 然后介绍一下这种一般装饰器的副作用:

   python装饰器会使原函数的属性被改变,比如func.__name__

  这里添加一行 print(func_A.__name__) 来展示影响

  技术图片输出效果:技术图片

 

 

   可以看到原函数 func_A 的名字变成了装饰器里面的函数 with_decor 的名字

  这导致一些特殊场合要用到这些属性时不方便,比如在 Robot Framework 自动化测试框架中调用函数,函数被装饰后就不能被正常调用


 因此可采用from functools import wraps,避免这种影响:

import os
from functools import wraps
def decor(func):
    @wraps(func)
    def with_decor(*args, **kwargs):
        return func(*args, **kwargs)
    return with_decor

@decor
def func_A(*args, **kwargs):
    print(call A)
    
func_A(1,2,3)
print(func_A.__name__)
os.system("pause")

  输出:技术图片  可以看到原函数的属性没有被改变

 

   wraps 的作用可以理解为消除装饰器的影响

消除装饰器对原函数的属性影响

标签:自动化测试   ram   自动化测试框架   ima   ret   width   调用   size   fun   

原文地址:https://www.cnblogs.com/Pio-GD/p/14204092.html

版权声明:完美者 发表于 2021-01-02 10:36:03。
转载请注明:消除装饰器对原函数的属性影响 | 完美导航

暂无评论

暂无评论...