"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Comprensión de los decoradores de Python: una inmersión profunda

Comprensión de los decoradores de Python: una inmersión profunda

Publicado el 2024-11-08
Navegar:703

Los decoradores de Python son herramientas poderosas que nos permiten modificar o mejorar el comportamiento de funciones o métodos. Los casos de uso comunes incluyen registro, autorización y más.
Sin embargo, cuando se les pide que definan un decorador, muchos podrían decir:

Es un contenedor para una función.

Si bien esto es técnicamente correcto, están sucediendo muchas más cosas bajo el capó.

Disección de un decorador simple
Exploremos un ejemplo sencillo:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

Aquí, my_decorator es un decorador para la función say_hello. Cuando se define say_hello, se pasa automáticamente a my_decorator, transformando la llamada a la función en:
decir_hola = mi_decorador(di_hola)

¿Cuándo ocurre esta transformación?
Esta transformación ocurre durante la compilación del código, específicamente en el momento de la definición de la función, no en el momento de la ejecución.

Desmontando el código
Para comprender cómo funcionan los decoradores en un nivel inferior, podemos usar el módulo dis para examinar el código de bytes de la función decorada:

import dis

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")

dis.dis(say_hello)

Desglose del código de bytes

La salida de dis.dis(say_hello) podría verse así:

Understanding Python Decorators: A Deep Dive
Explicación del código de bytes

  1. Antes de llamar a la función

    • LOAD_GLOBAL: Carga la función de impresión.
    • LOAD_CONST: Carga el mensaje 'Antes de llamar a la función'.
    • CALL_FUNCTION: Se imprimen llamadas.
    • POP_TOP: Descarta el valor devuelto.
  2. Llamar a la función original

    • LOAD_DEREF: Carga la función original (func) capturada por el cierre.
    • LOAD_FAST: Carga los argumentos posicionales y de palabras clave.
    • BUILD_MAP: crea un nuevo diccionario para argumentos de palabras clave.
    • CALL_FUNCTION_EX: Llama a la función original con los argumentos.
    • STORE_FAST: Almacena el resultado en una variable local.
  3. Después de llamar a la función

    • Similar a la primera parte, llama a print para generar 'Después de llamar a la función'.
    • Devolver el resultado
    • Carga la variable de resultado y la devuelve.

Conclusión
Los decoradores de Python son más que simples envoltorios de funciones; nos permiten modificar el comportamiento de la función en el momento de la definición. Al comprender cómo funcionan y examinar el código de bytes, podemos utilizar decoradores de manera más efectiva en nuestros proyectos.

¡Eso es todo por ahora! Si hay algo más en lo que te gustaría que profundizara, ¡házmelo saber!

Declaración de liberación Este artículo se reproduce en: https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3