Implementando funciones envoltorio (Wrapper Functions)
Función envoltorio básica
A continuación, un ejemplo sencillo de una función envoltorio básica en Python:
def uppercase_wrapper(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
@uppercase_wrapper
def greet(name):
return f"Hello, {name}!"
print(greet("LabEx")) ## Output: HELLO, LABEX!
En este ejemplo, la función uppercase_wrapper es una función envoltorio que toma un argumento func y devuelve una nueva función wrapper. La función wrapper llama a la función original func y luego convierte el resultado a mayúsculas antes de devolverlo.
La sintaxis @uppercase_wrapper es una forma abreviada de aplicar la función envoltorio a la función greet. Esto es equivalente a escribir greet = uppercase_wrapper(greet).
Funciones envoltorio parametrizadas
Las funciones envoltorio también pueden aceptar argumentos, lo que te permite personalizar su comportamiento. Aquí tienes un ejemplo de una función envoltorio parametrizada:
def repeat_wrapper(n):
def wrapper(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result * n
return inner
return wrapper
@repeat_wrapper(3)
def say_hello(name):
return f"Hello, {name}!"
print(say_hello("LabEx")) ## Output: Hello, LabEx!Hello, LabEx!Hello, LabEx!
En este ejemplo, la función repeat_wrapper es una función de orden superior que toma un argumento n y devuelve una nueva función envoltorio. La función envoltorio devuelta luego envuelve la función original func y repite el resultado n veces.
La sintaxis @repeat_wrapper(3) aplica la función repeat_wrapper con un argumento de 3 a la función say_hello.
Apilando funciones envoltorio
También puedes apilar múltiples funciones envoltorio en una sola función, lo que te permite aplicar múltiples capas de funcionalidad:
def uppercase_wrapper(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
def repeat_wrapper(n):
def wrapper(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result * n
return inner
return wrapper
@uppercase_wrapper
@repeat_wrapper(3)
def say_hello(name):
return f"Hello, {name}!"
print(say_hello("LabEx")) ## Output: HELLO, LABEX!HELLO, LABEX!HELLO, LABEX!
En este ejemplo, la función say_hello está primero envuelta por la función repeat_wrapper y luego por la función uppercase_wrapper. El orden de las funciones envoltorio importa, ya que se aplican desde la más interna a la más externa.
Al comprender la implementación de las funciones envoltorio, puedes crear un código de Python potente y flexible que mejore el comportamiento de tus funciones sin modificar su lógica central.