2017-07-19 81 views
0

我试图用通用装饰器执行所有的功能而不调用所有的功能。例如Python - 基于装饰器的执行

@run 
@v1 
def test1(): 
    #do something 

@run 
@v1 
@v2 
def test2(): 
#do something 

@run 
@v2 
def test3(): 
#do something 

@run 
def test4(): 
#do something 

我想执行基于装饰器的测试函数,如@run执行所有4个测试。 @ v1只执行前两个。我怎样才能做到这一点?任何指导都会有所帮助。

+0

你当然不能按照你写的方式去做;逗号不是有效的Python,也不是'v1.2'。 – kindall

+0

是的,我不能使用逗号,我可以在下一行添加新的装饰器。 我想执行基于装饰器的测试 – Kris

回答

0

你也许可以使用装饰在列表中“注册”您的功能:

_to_run = [] # list of functions to run 
def run(func): 
    _to_run.append(func) # add the decorated function to the list 
    return func 

@run 
def test1(): 
    print('test1') 
    return 1 

@run 
def test2(): 
    print('test2') 

def test3(): 
    print('test3') 

if __name__ == '__main__': 
    for test in _to_run: # iterate over registered functions 
     x = test() 
     print('Returned:', x) 

在另一方面,你可能也明确创建这个列表中,没有装饰。