2017-07-19 3 views
3

report.pyPython Dekorateure unter den Wert von konstant weitergegeben

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 Funktion:

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 

Diese Funktion überprüft, ob der Benutzer festgelegt haben die -t Argumente. Wenn es gesetzt ist, habe ich eine Konstante namens cons.DISPLAYRESULT auf True definiert.

Die Funktion funktioniert großartig und der konstante Wert wird auf True gesetzt. Aber in der Hauptfunktion habe ich diesen Dekorateure implementiert, die nicht den wahren Wert nehmen aber falsch

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 

ich eine Methode eingerichtet habe in main() -Methode des Berichts .py mit den Dekoratoren oben. Das ist zum Beispiel die Klasse in report.py verwendet wird und mit über Dekorateure

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 

hier dekoriert ich den konstanten Wert für das Argument Dekorateur bestanden haben, die , wenn sie aufgerufen, obwohl zuvor getestet wird umgewandelt True unter falscher und damit die Dekoratoren nicht implementiert werden. Wo ist das Problem kann nicht herausfinden

+0

Dies ist ein trivialer Punkt, aber vielleicht Ich verstehe deinen letzten Absatz nicht. Wenn Sie sagen "Ich habe den konstanten Wert an den Argument-Dekorator übergeben" meinst du '@benchmarking (const)'? Dann ist "const ist wahr" und "bool (const) ist wahr" wird unterschiedliche Ergebnisse haben. –

+0

Ich möchte sagen, ich habe die Konstante definiert und dieser Wert ist, was die Decorators übergeben wird. Der Decorators wird nur ausgeführt, wenn dieser Wert auf 'True' gesetzt ist. Aber was passiert ist gedacht, der konstante Wert ist die Änderung zu True der Dekorateur wird zuerst geladen und nimmt die 'False' anstatt –

Antwort

2

Sie haben keinen vollständigen minimal nachprüfbare Beispiel veröffentlichen, so könnte es etwas anderes sein, aber wenn Ihr Punkt das ist, wenn NotAccountedReport().makeNotAccountableReport() rufen Sie nicht bekommen, Ihre „Zeit genommen "gedruckt, dann ist es wirklich keine Überraschung - die benchmarking Dekorator wird angewendet, wenn die Funktion definiert ist (wenn das Modul importiert wird), lange bevor die if __name__ == '__main__' Klausel ausgeführt wird, so dass cons.DISPLAY_TIME_STAMP zu dieser Zeit nicht von Ihrer Befehlszeile args aktualisiert wurde.

Wenn Sie ein Laufzeit-Flag Ihres Dekorateur Verhalten aktivieren/deaktivieren die offensichtliche Lösung ist innerhalb des Dekorateur zu überprüfen cons.DISPLAY_TIME_STAMP statt es als Argument übergeben, das heißt:

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

Das ist genau das Problem ist. Was kann also für die Lösungen getan werden? Das 'cons.DISPLAY_TIME_STAMP' wird aktualisiert, ist aber, wie Sie erwähnt haben, der Dekorator nimmt Wert, bevor die Funktion aufgerufen wird in 'if __name __ ==' __ main__ '. Irgendwelche Lösungen dafür –

+1

Nun, es scheint ziemlich offensichtlich zu sein: Übergeben Sie 'cons.DISPLAY_TIME_STAMP' nicht als Argument an Ihren Dekorateur, überprüfen Sie es einfach direkt, siehe meine bearbeitete Antwort. –

Verwandte Themen