Chaining Decorators
Lição 7 de 12 do curso Decoradores em Python da Coddy.
É possível encadear vários decoradores para modificar o comportamento de uma função. Para encadear decoradores, basta aplicá-los um após o outro, com o decorador mais interno mais próximo da função que está sendo decorada.
Aqui está um exemplo:
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())A saída final é:
<b><i>Hello, world!</i></b>Observe que no exemplo acima o decorador retorna o valor da função; até agora, só tínhamos visto decoradores que executam a função sem retornar seu resultado!
Desafio
MédioEscreva uma função chamada my_decorator que recebe um argumento inteiro n e retorna uma função decoradora que envolve uma determinada função func em n camadas de tags HTML. A tag mais externa deve ser <div>, a próxima camada deve ser <p>, e assim por diante, com cada camada subsequente alternando entre as tags <div> e <p>. A camada mais interna deve envolver a saída da função em tags <b>.
Você recebeu o código que será executado com my_decorator, não o altere!
Exemplo:
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)Saída:
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>Use novas linhas (
\n) para formatar a saída corretamente!
Experimente você mesmo
# Escreva o código aqui
# Não altere abaixo desta linha
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)Todas as lições de Decoradores em Python
Pratique por conta própria: Compilador de Python online