Chaining Decorators
Lección 7 de 12 del curso Decoradores de Python de Coddy.
Es posible encadenar múltiples decoradores para modificar el comportamiento de una función. Para encadenar decoradores, simplemente los aplicas uno tras otro, con el decorador más interno más cerca de la función que se está decorando.
Aquí tienes un ejemplo:
def make_bold(func):
def wrapper():
return "<b>" + func() + "</b>"
return wrapper
def make_italic(func):
def wrapper():
return "<i>" + func() + "</i>"
return wrapper
@make_bold
@make_italic
def hello():
return "Hello, world!"
print(hello())El resultado final es:
<b><i>Hello, world!</i></b>¡Observa que en el ejemplo anterior el decorador devuelve el valor de la función, hasta ahora solo habíamos visto decoradores que ejecutan la función sin devolver su resultado!
Desafío
IntermedioEscribe una función llamada my_decorator que tome un argumento entero n y devuelva una función decoradora que envuelva una función dada func en n capas de etiquetas HTML. La etiqueta más externa debe ser <div>, la siguiente capa debe ser <p>, y así sucesivamente, alternando cada capa subsiguiente entre etiquetas <div> y <p>. La capa más interna debe envolver la salida de la función en etiquetas <b>.
Se te proporciona el código que se ejecutará con my_decorator, ¡no lo cambies!
Ejemplo:
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)Salida:
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>¡Usa saltos de línea (
\n) para formatear la salida correctamente!
Pruébalo tú mismo
# Escribe el código aquí
# No cambies nada debajo de esta línea
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)Todas las lecciones de Decoradores de Python
Practica por tu cuenta: Compilador de Python online