es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuenta cuántas funciones utilizan un decorador.

Sé que los decoradores se pueden utilizar para contar cuántas veces se utiliza una función de esta manera:

import functools

def counted_calls(f):
    @functools.wraps(f)
    def count_wrapper(*args, **kwargs):
        count_wrapper.count += 1
        return f(*args, **kwargs)
    count_wrapper.count = 0
    return count_wrapper

Mi caso de uso es ligeramente diferente. Quiero realizar el seguimiento de lo siguiente:

  • Cuántas veces se utiliza un decorador.
  • Qué funciones están decoradas en un archivo.

¿Es posible hacer esto en Python? Si es así, ¿cómo puedo hacerlo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible en Python realizar un seguimiento de cuántas veces se utiliza un decorador y qué funciones están decoradas en un archivo. Una forma de lograr esto es utilizando una variable global para realizar un seguimiento del número de veces que se utiliza un decorador y un diccionario para almacenar información sobre las funciones decoradas. Aquí hay un ejemplo de implementación:

    import functools
    
    contador_decoradores = 0
    funciones_decoradas = {}
    
    def realizar_seguimiento_decoradores(f):
        nonlocal contador_decoradores
        contador_decoradores += 1
    
        @functools.wraps(f)
        def envoltorio(*args, **kwargs):
            return f(*args, **kwargs)
    
        if f.__name__ not in funciones_decoradas:
            funciones_decoradas[f.__name__] = []
        funciones_decoradas[f.__name__].append(envoltorio.__name__)
    
        return envoltorio
    

    En esta implementación, definimos una variable global contador_decoradores que realiza un seguimiento del número de veces que se llama al decorador realizar_seguimiento_decoradores. Dentro del decorador, utilizamos la palabra clave nonlocal para acceder y actualizar el valor de contador_decoradores.

    También definimos un diccionario funciones_decoradas para almacenar información sobre las funciones decoradas. Dentro del decorador, verificamos si la función actual f ya ha sido agregada al diccionario. Si no es así, creamos una nueva entrada con el nombre de la función como clave y una lista vacía como valor. Luego, agregamos el nombre de la función envoltorio a la lista de funciones decoradas para la función actual.

    Para usar este decorador, simplemente decora las funciones que deseas realizar un seguimiento con @realizar_seguimiento_decoradores. Después de ejecutar tu código, puedes acceder a la variable contador_decoradores y al diccionario funciones_decoradas para obtener la información deseada.

    Ten en cuenta que esta implementación asume que cada función solo está decorada una vez. Si una función se decora varias veces con el mismo decorador, la información en funciones_decoradas se sobrescribirá. Para manejar este caso, puedes modificar el código para utilizar un diccionario anidado o una lista de tuplas para almacenar información sobre cada decorador utilizado en una función.

Comments are closed.