quinta-feira, 14 de dezembro de 2017

Decorators em Python - parte 2

Aplicando mais de um decorador numa função

No exemplo abaixo, temos a função get_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'))
<p>Olá Francisco, seja bem vindo ao nosso site!</p>

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"))
<div><p><strong>Olá John, seja bem vindo ao nosso site!</strong></p></div>

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"))
<div><p><strong>Olá John, seja bem vindo ao nosso site!</strong></p></div>

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"))
<strong><div><p>Olá John, seja bem vindo ao nosso site!</p></div></strong>


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