2016-07-11 14 views
0

Ich habe einen schönen Teil des Codes geschrieben, und ich möchte meine ausführliche Ausgabe verbessern. Ich hatte die Idee eines if verbose: print '**** function_name ****' am Anfang und Ende der Funktion und definiert auch eine Funktion, um es einfacher zu nennen (Ich bin das sehr sexy ausführliche Drucken mit von Kindall geschrieben here)Wie drucke ich Anfang und Ende der Funktion mit ausführlichen, Python?

def verbwrap(function, side): 
    if side=='start': 
     verboseprint(' ****** %s ******' %(function)) 
    if side=='end': 
     verboseprint(' ^^^^^^ %s ^^^^^^' %(function)) 

mit der Absicht, es so mit:

import inspect 

def test(lst): 
    verbwrap(inspect.currentframe().f_code.co_name,'start') 
    for i in lst: 
     print i 
    verbwrap('test', 'end') #equivalent to above, but easier to write :(

gibt es eine Möglichkeit für mich nur rufen eine überarbeitete verbwrap() einmal? Keine Menge an Basteleien hat mich zur Antwort geführt!

+1

Was meinen Sie mit "call a re-working' verbwrap() 'once"? –

+0

Entschuldigung, ich meine, gibt es eine Alternative zu meinem 'verbwrap()', die nur einmal in 'test()' aufgerufen werden müsste, um am Anfang und am Ende der Funktion zu drucken? – FriskyGrub

Antwort

3

In Anbetracht, dass Sie nur am Anfang und am Ende der Funktion etwas drucken möchten, ist der beste Weg dies zu tun, einen Dekorateur zu verwenden.

def verbwrap(function): 
    def wrapper(*args, **kwargs): 
     verboseprint(' ****** %s ******' %(function.__name__)) 
     result = function(*args, **kwargs) 
     verboseprint(' ^^^^^^ %s ^^^^^^' %(function.__name__)) 
     return result 
    return wrapper 

nun die oben Dekorateur mit jeder Funktion verwenden Sie wollen debug:

@verbwrap 
def test(lst): 
    for i in lst: 
     print i 

Demo:

Wenn verbose ist True:

****** test ****** 
1 
2 
3 
^^^^^^ test ^^^^^^ 

Wenn verbose ist False:

1 
2 
3 

du noch mehr Dynamik durch Berechnung des Wertes der verbose innerhalb der wrapper Funktion machen, die diesen Ansatz verwenden Sie debuggen entscheiden können, oder nicht zu debuggen, wenn die Funktion tatsächlich aufgerufen wird, .

def verbwrap(function): 
    def wrapper(*args, **kwargs): 
     # Calculate the value of `verbose` here. 
     # Say you're reading it from a config etc 
     verbose = False 
     if verbose: 
      print ' ****** %s ******' %(function.__name__) 
      result = function(*args, **kwargs) 
      print ' ^^^^^^ %s ^^^^^^' %(function.__name__) 
      return result 
     else: 
      return function(*args, **kwargs) 
    return wrapper 
+0

Wow, das ist erstaunlich! Ich wusste nichts über Dekorateure, das ist wirklich ordentlich. Vielen Dank. – FriskyGrub