python decorators没有从常量传递值

时间:2017-07-19 12:01:53

标签: python python-2.7 python-decorators

report.py

if __name__ == "__main__":    
    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter, description = "CHECK-ACCESS REPORTING.")
    parser.add_argument('--input','-i', help='Filepath containing the Active Directory userlist')
    parser.add_argument('--timestamp', '-t', nargs='?',const="BLANK", help='filepath with environement varible set')        
    args, unknownargs = parser.parse_known_args(sys.argv[1:])

    timestampchecker(args.timestamp)
    #checking the value of cons.DISPLAYRESULT is TRUE        
    main()

timestampchecker功能:

def timestampchecker(status):
    """ Check if the timestamp is to display or not from command line"""
    if status is not None:
        cons.DISPLAY_TIME_STAMP = True

此函数检查用户是否设置了 -t 参数。如果设置了,我将一个名为 cons.DISPLAYRESULT 的常量定义为true。

该功能运行良好,将常量值变为True。 但是在main函数中我已经实现了这个装饰器,它没有采用真正的值而是假的

timer.py

def benchmarking(timestaus):
    def wrapper(funct):
        def timercheck(*args, **kwarg):
            if timestaus is True:
                starttime=time.time()
            funct(*args, **kwarg)
            if timestaus is True:
                print('Time Taken:',round(time.time()-starttime, 4))
        return timercheck
    return wrapper

我在report.py的main()方法中使用上面的装饰器修饰了一些方法。例如,这是在report.py中使用的类,并使用上面的装饰器进行装饰

class NotAccountedReport:

    def __init__(self, pluginoutputpath):
        """ Path where the plugins result are stored need these files"""

        self.pluginoutputpath = pluginoutputpath

    @benchmarking(cons.DISPLAY_TIME_STAMP)
    def makeNotAccountableReport():
        #some functionality
  

这里我将常量值传递给参数装饰器   虽然在被调试之前被测试被转换为True是假的   因此装饰器没有实现。问题出在哪儿   无法弄清楚

1 个答案:

答案 0 :(得分:2)

您没有发布一个完整的最小可验证示例,因此可能还有其他内容,但如果您的意思是,在致电NotAccountedReport().makeNotAccountableReport()时您不会得到您的时间" #34;打印然后它真的不是一个惊喜 - benchmarking装饰器在定义函数时(导入模块时),在执行if __name__ == '__main__'子句之前应用,所以当时您的命令行args尚未更新cons.DISPLAY_TIME_STAMP

如果你想要一个运行时标志来激活/停用装饰器的行为,显而易见的解决方案是检查装饰器中的cons.DISPLAY_TIME_STAMP而不是将其作为参数传递,即:

def benchmarking(func):
    def timercheck(*args, **kwarg):
        if cons.DISPLAY_TIME_STAMP:
           starttime=time.time()
        result = func(*args, **kwarg)
        if cons.DISPLAY_TIME_STAMP:
            logger.debug('Time Taken: %s',round(time.time()-starttime, 4))
        return result  
    return timercheck


class NotAccountedReport(object):
    @benchmarking
    def makeNotAccountableReport():
        #some functionality