Aplicando mais de um decorador numa função
No exemplo abaixo, temos a funçãoget_text decorada com @p_decorate que envolve o texto numa tag p.def p_decorate(func):
def func_wrapper(nome):
return "<p>{}</p>".format(func(nome))
return func_wrapper
@p_decorate
def get_text(nome):
return "Olá {}, seja bem vindo ao nosso site!".format(nome)
print(get_text('Francisco'))
Agora, considerem que queiramos decorar nossa função get_text com outras 2 funções para envolver uma div e uma label strong em torno da saída do paragráfo.
def get_text(nome):
return "Olá {}, seja bem vindo ao nosso site!".format(nome)
def p_decorate(func):
def func_wrapper(nome):
return "<p>{}</p>".format(func(nome))
return func_wrapper
def strong_decorate(func):
def func_wrapper(name):
return "<strong>{0}</strong>".format(func(name))
return func_wrapper
def div_decorate(func):
def func_wrapper(name):
return "<div>{0}</div>".format(func(name))
return func_wrapper
Com a abordagem básica, decorar get_text() seria com a linha de comando abaixo:
get_text = div_decorate(p_decorate(strong_decorate(get_text)))
print (get_text("John"))
Com a sintaxe do decorador do Python, a mesma coisa pode ser alcançada de uma forma mais clara:
@div_decorate
@p_decorate
@strong_decorate
def get_text(nome):
return "Olá {}, seja bem vindo ao nosso site!".format(nome)
print (get_text("John"))
Uma coisa importante a observar é que a ordem dos nossos decoradores é importante. O primeiro decorador é o último a ser aplicado.
Se, por exemplo, colocarmos
@strong_decorate em primeiro, todo o texto restante é inserido dentro da tag strong.@strong_decorate
@div_decorate
@p_decorate
def get_text(nome):
return "lorem ipsum, {0} dolor sit amet".format(nome)
# Basicamente, o que está sendo feito com o decorador é:
# get_text = div_decorate(p_decorate(strong_decorate(get_text)))
print (get_text("John"))
Jupyter notebook contendo o código deste estudo:
github.com/FranciscoACLima/Python-decorators
Mais sobre o uso de decoradores em Python:
thecodeship.com/patterns/guide-to-python-function-decorators/
Continua em:
Decorators em Python - parte 3
Até...
Francisco ACLima
Nenhum comentário:
Postar um comentário