Decoradores de Python

Decoradores de Python
Neste artigo, vamos discutir os decoradores do Python.

Definição: Decorador é um padrão de design em Python. É uma função que tem outra função como argumento, adicione alguma funcionalidade a ela sem modificá -la e retorna outra função.

Isso é chamado usando "(@)" e colocado antes de definir uma função que queremos decorar.

sintaxe:

@Decorator Nome
Definição da função

Para entender os decoradores, precisamos saber os conceitos abaixo.
Funções são objetos de primeira classe. Isso significa que uma função pode ser passada como um argumento, pode ser retornada de outra função, pode ser atribuída a uma variável, pode ser definida em outra função. Para uma melhor compreensão, veja os exemplos abaixo.

  1. Uma função pode ser passada como um argumento
    Ex: Def increment (n):
    retornar n + 1
    def Demo_funcall (função):
    num = 5
    Função de retorno (NUM)
    Demo_funcall (incremento)

    Aqui a função de incremento passou como um argumento

    Exemplo 1.PY:

    Saída:

    >> Python Exemplo1.py

  2. A função pode ser retornada de outra função
    Ex: def Wish ():
    def say_wish ():
    retornar "feliz aniversário"
    Retorne Say_wish
    Olá = desejo ()
    olá()

    Exemplo2.PY:

    Saída:

    >> Python Exemplo2.py

    Aqui Say_Wish Função retornou da função de desejo

  3. A função pode ser modificada e atribuída a uma variável
    Ex: def add (a, b):
    Retornar A +B
    SUM2NOS = Adicionar # aqui Função Adicionar atribuída à variável
    SUM2NOS (5,11)

    Exemplo3.PY:

    Saída:
    >> Python Exemplo3.py

  4. Defina a função dentro de outra função
    Ex: def add (a, b):
    def sum2 (a, b):
    Retornar A + B
    res = SUM2 (a, b)
    retornar res
    Adicionar (10,15)

    Exemplo4.PY:

    Saída:
    >> Python Exemplo4.py

Fecho:

O Python permite que uma função aninhada acesse o escopo externo da função de anexo.

Def saudação (mensagem):
"Função do Enclosong"
def send_greeting ():
"Função aninhada"
Imprimir (mensagem)
send_greeting ()
saudação ("bom dia")

Exemplo5.PY:

Saída:

>> Python Exemplo5.py

Depois de entender os conceitos acima agora, escreveremos um exemplo de decorador.

Ex1: Aqui, decoraremos a função de mensagem. Imprimindo a msg dentro **** sem modificar a função original, i.e., função de mensagem.

#Decorator Start
DEF Print_msg (função):
def wrapper ():
função()
Retornar invólucro
#decorator final
Def Message ():
Imprimir (“Este é o primeiro exemplo para demonstrar decorador”)
Olá = print_msg (mensagem)
olá()

Exemplo6.PY:

Saída:

>> Python Exemplo6.py

Na forma mais simples, podemos colocar o decorador em cima da definição da função e chamar a função como mostrado abaixo:

Aqui, qualquer corda que queremos decorar dentro ***, use este decorador.

Saída:

Decorador múltiplo:

Podemos ter um decorador múltiplo para uma única função. Aqui o decorador é aplicado na ordem que chamamos.
sintaxe:
@decorator2
@decorator1
Definição da função

Aqui o 1º Decorador será aplicado, então o 2º decorador.

Passando argumentos para as funções do decorador:

Podemos passar argumentos para a função de invólucro. Os argumentos passados ​​para a função para a qual queremos decorar.

Ex:

def déco_wish (função):
DEF Wrapper (Arg1, Arg2):
Print ('Os argumentos passados ​​são', arg1, arg2)
imprimir ('*********************')
função (arg1, arg2)
imprimir ('*********************')
Retornar invólucro
@DECO_WISH
Def Wish (A1, A2):
Imprimir (A1, A2)
Desejo ('bom', 'manhã')
desejo ('bom', 'tarde')

Exemplo7.PY:

Saída:

>> Python Exemplo7.py

Passe o número variável de argumentos para a função do decorador:

Podemos passar por qualquer número de argumentos usando *args (argumentos não-chave como números) e ** kwargs (argumentos de palavras-chave como um dicionário). Ambos são argumentos posicionais e armazenam os argumentos nas variáveis ​​Args e Kwargs.

Nota: Aqui, podemos usar qualquer nome em vez de args e kwargs, mas esses nomes são recomendados para usar.

Ex:

DEF DEC_VAR_ARGS (FUNÇÃO):
DEF Wrapper (*args, ** kwargs):
Print ('Os argumentos não -chave são', args)
Print ('Os argumentos das palavras -chave são', Kwargs)
função (*args)
Retornar invólucro
@ dec_var_args
def fun_non_key_args (*args):
para eu em args:
impressão (i)
@ dec_var_args
def fun_key_args ():
Imprimir (“Argumentos de palavra -chave”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

Exemplo8.PY:

Saída:

>> Python Exemplo8.py

Ex2: suponha que tenhamos 2 função
Função1: calcule a soma dos números da lista dada
Função2: multiplique cada número por 2 e adicione -os à lista fornecida de números
Se quisermos calcular o tempo gasto por cada uma para execução, pode fazê -lo de 2 maneiras

  1. Coloque o código entre o horário de início e término em cada função
  2. Escreva decorador para calcular o tempo

Veja o código abaixo resolvido usando o decorador:

#Decorator Start
EXE_TIME_CALC (FUNC):
DEF Wrapper (arg):
start_time = datetime.data hora.agora()
func (arg)
end_time = datetime.data hora.agora()
print ("O tempo para executar a função" + func.__name__ + "Is" + str (end_time - end_time))
Retornar invólucro
#decorator final
@EXE_TIME_CALC
def cal_avg (dados):
soma = 0
para i em dados:
soma += eu
print ("A média da determinada lista de números é", soma // len (dados))
@EXE_TIME_CALC
def mul_by_2 (dados):
soma = 0
para i em dados:
soma + = + (i*2)
Imprima ("O sume de todos os números após multiplicar por 2 é", soma)
Cal_AVG ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

Exemplo9.PY:

Saída:

>> Python Exemplo9.py

O decorador acima pode ser usado para calcular o tempo de execução para qualquer uma das funções. Ao usar um decorador, podemos evitar o código repetido quando temos um requisito para calcular o tempo de execução para colocar o decorador acima da definição da função.

Conclusão:

Os decoradores mudam a funcionalidade de uma função/método sem alterar o código original da função está sendo decorado. Usando isso, podemos evitar escrever código repetido. Conhecer o conceito de decorador nos tornará fortes no Python. Podemos usar o decorador nos casos abaixo:

  • Autorização em Python Frameworks Ex: Flask and Django
  • Exploração madeireira
  • Medir o tempo de execução