2012-03-27 14 views
11

aufgerufen wurde ich in Python bin Programmierung, und ich frage mich, ob ich testen kann, wenn eine Funktion in meinem CodeFinde heraus, ob eine Funktion hat

def example(): 
    pass 
example() 
#Pseudocode: 
if example.has_been_called: 
    print("foo bar") 

Wie würde ich das tun genannt wurde?

+0

ich schrieb eine [Zählen Dekorateur] (http: //code.activestate.com/recipes/577534-counting-decorator/?in=user-4173873), die bei der Anwendung angeben, wie oft eine Funktion aufgerufen wurde. Sie können dies an Ihre Bedürfnisse anpassen, wenn Sie möchten. –

+0

Was erhoffen Sie sich mit diesen Informationen? –

Antwort

20

Wenn es OK ist für die Funktion ihre eigenen Namen zu kennen, können Sie eine Funktion Attribut verwenden:

def example(): 
    example.has_been_called = True 
    pass 
example.has_been_called = False 


example() 

#Actual Code!: 
if example.has_been_called: 
    print("foo bar") 

Sie auch einen Dekorateur verwenden könnte das Attribut festlegen:

import functools 

def trackcalls(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     wrapper.has_been_called = True 
     return func(*args, **kwargs) 
    wrapper.has_been_called = False 
    return wrapper 

@trackcalls 
def example(): 
    pass 


example() 

#Actual Code!: 
if example.has_been_called: 
    print("foo bar") 
+0

Es ist interessant zu wissen, dass die Funktion ein Attribut erhalten kann, weil alles in Python ein Objekt ist. Funktionen sind Objekte der Klasse "function". Und Sie können einer Instanz ein Attribut zuweisen, da Sie Variablen in Python nicht deklarieren müssen, damit Sie sie zur Laufzeit zuweisen können. –

0

hier ein ist Dekorateur, der mit colorama alle Funktionen überwacht, um eine schöne Ausgabe zu erhalten.

Versuch: Import coloramac außer Import: Klasse StdClass: pass def Passant (* args, ** kwargs): pass colorama = StdClass() colorama.init = Passant colorama.Fore = StdClass () colorama.Fore.RED = colorama.Fore.GREEN = ''

def check_for_use(show=False): 
    if show: 
     try: 
      check_for_use.functions 
     except AttributeError: 
      return 
     no_error = True 
     for function in check_for_use.functions.keys(): 
      if check_for_use.functions[function][0] is False: 
       print(colorama.Fore.RED + 'The function {!r} hasn\'t been called. Defined in "{}" '.format(function, check_for_use.functions[function][1].__code__.co_filename)) 
       no_error = False 
     if no_error: 
      print(colorama.Fore.GREEN + 'Great! All your checked function are being called!') 
     return check_for_use.functions 
    try: 
     check_for_use.functions 
    except AttributeError: 
     check_for_use.functions = {} 
     if colorama: 
      colorama.init(autoreset=True) 

    def add(function): 
     check_for_use.functions[function.__name__] = [False, function] 
     def func(*args, **kwargs): 
      check_for_use.functions[function.__name__] = [True, function] 
      function(*args, **kwargs) 
     return func 
    return add 

@check_for_use() 
def hello(): 
    print('Hello world!') 

@check_for_use() 
def bonjour(nb): 
    print('Bonjour tout le monde!') 


# hello(); bonjour(0) 

hello() 


check_for_use(True) # outputs the following 
Ausgang:
Hello world! 
The function 'bonjour' hasn't been called. Defined in "path_to_file.py" 
Verwandte Themen