domingo, 6 de dezembro de 2020

Decoradores de função em Python

Background

A seguir estão fatos importantes sobre funções em Python que são úteis para entender as funções do decorador.

  • Em Python, podemos definir uma função dentro de outra função.
  • Em Python, uma função pode ser passada como parâmetro para outra função (uma função também pode retornar outra função).
# Um programa Python para demonstrar que uma função
# pode ser definida dentro de outra função e uma
# função pode ser passada como parâmetro.

# Adiciona uma mensagem de boas-vindas à string
def messageWithWelcome(str):

    # Função aninhada
    def addWelcome():
        return "Bem-vindo a "

    # Retorna a concatenação de addWelcome() e str 
    return addWelcome() + str

# Para obter o nome do site ao qual as boas-vindas são adicionadas
def site(site_name):
    return site_name

print(messageWithWelcome(site("Acervo Lima"))) 

Resultado:

Bem-vindo a Acervo Lima

Decorador de Função

Um decorador é uma função que recebe uma função como seu único parâmetro e retorna uma função. Isso é útil para “embrulhar” a funcionalidade com o mesmo código repetidamente. Por exemplo, o código acima pode ser reescrito da seguinte forma.

Usamos @func_name para especificar um decorador a ser aplicado em outra função.

# Adiciona uma mensagem de boas-vindas à string
# retornado por fun(). Pega fun() como
# parâmetro e retorna welcome().

def decorate_message(fun):

    # Função aninhada
    def addWelcome(site_name):
        return "Bem-vindo ao " + fun(site_name)

    # O decorador retorna uma função
    return addWelcome

@decorate_message
def site(site_name):
    return site_name;

# Esta chamada é equivalente a chamar
# decorate_message() com função
# site("Acervo Lima") como parâmetro
print(site("Acervo Lima"))

Resultado:

Bem-vindo ao Acervo Lima

Decoradores também podem ser úteis para anexar dados (ou adicionar atributos) às funções.

# Um exemplo Python para demonstrar que
# decoradores podem ser úteis para anexar dados

# Uma função de decorador para anexar
# dados para func
def attach_data(func):
    func.data = 3
    return func 

@attach_data
def add (x, y):
    return x + y 

# Esta chamada é equivalente a attach_data()
# com add() como parâmetro
print(add(2, 3))
print(add.data) 

Resultado:

5
3

'add()' retorna a soma de x e y passada como argumentos, mas é envolvida por uma função decoradora, chamar add(2, 3) simplesmente forneceria a soma de dois números, mas quando chamamos add.data, a função 'add' é passado para a função de decorador 'attach_data' como argumento e esta função retorna a função 'add' com um atributo 'data' que é definido como 3 e, portanto, imprime-o.

Artigo escrito por Shwetanshu Rohatgi e traduzido por Acervo Lima de Function Decorators in Python | Set 1 (Introduction)

0 comentários:

Postar um comentário