2017-07-19 27 views
3

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功能:

​​

該功能檢查用戶是否已經設置了-t參數。如果設置了,我已經定義了一個叫做cons.DISPLAYRESULT的常量爲true。

該函數運行良好,並將常量值設置爲True。 但在主要功能我已經實現了這個裝飾它沒有采取真正的價值,但假

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 

我裝飾了一些方法,在報告的main()方法.py與上面的裝飾器。例如,這是在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是採取虛假 ,因此裝修未實施。問題出在哪裏 找不出

+0

這是一個無足輕重的問題,但也許我不理解你的最後一段。當你說「我已經將常數值傳遞給參數裝飾器」時,你的意思是'@benchmarking(const)'?那麼'const是True'和'bool(const)是True'將會有不同的結果。 –

+0

我的意思是說我已經定義了常量,並且該值是裝飾器正在傳遞的值。只有當該值設置爲「True」時,裝飾器纔會運行。但是,發生了什麼是認爲常數值是真正的裝飾者正在加載,並採取'False'而不是 –

回答

2

你沒有張貼一個完整的最小可覈查的例子所以有可能是別的東西太多,但如果你的一點是,調用NotAccountedReport().makeNotAccountableReport()當你沒有得到你採取「時代「然後它真的不是一個驚喜 - 當定義函數(當模塊被導入時),在執行if __name__ == '__main__'子句之前,將應用裝飾器,因此當時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 
+0

這正是問題所在。那麼可以爲解決方案做些什麼。 'cons.DISPLAY_TIME_STAMP'被更新,但正如你所提到的那樣,在函數被調用之前,裝飾器正在獲取值'if __name __ =='__ main__'。它的任何解決方案 –

+1

好吧,這似乎很明顯:不要傳遞'cons.DISPLAY_TIME_STAMP'作爲你的裝飾器的參數,直接檢查它,比較我編輯的答案。 –