Menu
Coddy logo textTech

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!

challenge icon

Desafio

Médio

Escreva 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