Averigüe si una función ha sido llamada

Estoy progtwigndo en Python, y me pregunto si puedo probar si una función ha sido llamada en mi código.

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

¿Cómo haría esto?

Si está bien que la función sepa su propio nombre, puede usar un atributo de función:

 def example(): example.has_been_called = True pass example.has_been_called = False example() #Actual Code!: if example.has_been_called: print("foo bar") 

También puedes usar un decorador para establecer el atributo:

 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") 

Las funciones de memorización han existido desde la década de 1960. En Python, puedes usarlos como decoradores en tu función example () .

La función de memoización estándar se ve algo como esto:

 def memoize(func): memo = {} def wrapper(*args): if not args in memo: memo[args] = func(*args) return memo[args] return wrapper 

Y decoras tu función así:

 @memoize def example(): pass 

En python3.2, puedes usar functools.lru_cache en lugar de la función de memoria.

 import functools @functools.lru_cache(maxsize=None) def example(): pass 

Aquí hay un decorador que vigilará todas tus funciones, usando colotwig, y ​​devolverá un buen resultado.

 try: import colotwig except ImportError: class StdClass: pass def passer(*args, **kwargs): pass colotwig = StdClass() colotwig.init = passer colotwig.Fore = StdClass() colotwig.Fore.RED = colotwig.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(colotwig.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(colotwig.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 colotwig: colotwig.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 

Salida:

 Hello world! The function 'bonjour' hasn't been called. Defined in "path_to_file.py"