Decorators

Explicação

"Decorators" conseguem modificar o comportamento de uma função/método sem alterar seu código fonte. Eles são como uma camada extra que você pode adicionar em torno de uma função, permitindo que seja executado um código adicional antes ou depois dela, ou até mesmo substituir completamente sua funcionalidade.

Como Funcionam os Decorators na prática?

Um "decorator" é basicamente uma função que recebe outra função como argumento e retorna uma nova função que geralmente estende ou modifica o comportamento da função original. A função original é então substituída pela nova função retornada pelo decorator.

Demonstração

  • Importa as bibliotecas necessárias para o exemplo:

    from time import perf_counter # coleta de tempo
    from datetime import timedelta # formata tempo fornecido pela lib acima
    from selenium import webdriver # navegação na web
    from selenium.webdriver.chrome.service import Service # instancia webdriver
    from selenium.webdriver.common.by import By # apoia busca de elementos na página web
    
  • Para esse exemplo, será necessário ter o Selenium.

    • Caso não tenha, basta executar o comando no CMD/Terminal:

      pip install selenium
      
  • Cria o decorator "@tempo_medio_funcao":

    def tempo_medio_funcao(func): # o nome dessa função representa o decorator e ira fornecer a função encapsulada
        def wrapper(*args, **kwargs): # funcao interna com nome generico que conterá as funcionalidades desejadas
            inicial = perf_counter() # coleta tempo inicial
            func(*args, **kwargs) # executa função a ser cronometrada
            final = perf_counter() # coleta tempo final
            tempo = final - inicial # efetua subtracao para identificar tempo médio da execução
            return f'O tempo da função "{func.__name__}" foi de {timedelta(seconds=tempo)} (sem formatação: {tempo})' # Retorna mensagem final
        return wrapper
    
  • Atribui o decorator "@tempo_medio_funcao" na função "requisite_site" para checar o tempo médio da sua execução

    @tempo_medio_funcao
    def requisita_site(site):    
        driver = webdriver.Chrome(
            service=Service('caminho/do/seu/chromedriver.exe')
            )
        driver.implicitly_wait(30)
        driver.get(site)
        driver.find_element(By.ID, "search")
        driver.quit()
    
  • Executa a função "requisite_site" e emite o resultado na tela

    print(requisita_site('https://www.google.com.br/search?q=Python'))
    # retorno: O tempo da função "requisita_site" foi de 0:00:09.990927 (sem formatação: 9.9909265)