- 常规装饰器
# 1. 不带参数
def wrapper(func):  # 装饰器函数,func为被装饰函数
    def inner(*args, **kwargs):
        """被装饰函数前需要添加的内容"""
        ret = func(*args, **kwargs)  # 被装饰函数
        """被装饰函数后需要添加的内容"""
        return ret
    return inner
# 2. 带参数装饰器
def out_wrapper(flag):     
         def wrapper(func): #装饰器函数,func为被装饰函数   
                def inner(*args,**kwargs):        
                        """被装饰函数前需要添加的内容"""                 
                        ret=func(*args,**kwargs) #被装饰函数        
                        """被装饰函数后需要添加的内容"""        
                        return ret   
                return inner
        return wrapper
- 【带参数】,【非两层装饰器】
# 位置 robot\libraries\BuiltIn.py
def run_keyword_variant(resolve):
    def decorator(method):
        RUN_KW_REGISTER.register_run_keyword('BuiltIn', method.__name__,
                                             resolve, deprecation_warning=False)
        return method
    return decorator
@run_keyword_variant(resolve=0)
def set_suite_variable(self, name, *values):
# 理解简化版本
def wrapper(wrapper_arg):
    def inner(inner_arg):
        print('before inner')
        print('wrapper_arg: ',wrapper_arg)
        print('inner_arg: ',inner_arg)
        return inner_arg  
    return inner
# 1
# @wrapper   # wrapper_arg:  <function atest_fun at 0x000002CB991694C8>
# def atest_fun(test_name):
#     print('in atest_fun agr: ',test_name)  # 没有执行
#
# atest_fun('name1')
# 2
@wrapper(123)  # wrapper_arg:  123
def atest_fun(test_name):
    print('in atest_fun agr: ',test_name)   # 执行了
atest_fun('name1')