Domine o `pass` em Python: Guia Completo com Exemplos!

Ao desenvolver um programa, é raro que se escreva todo o código de uma vez e apenas o execute ao final. O processo mais comum envolve escrever parte do código, executá-lo, adicionar mais código e repetir esse ciclo até a conclusão.

Na prática, você estará dividindo o problema em partes menores, focando em seções essenciais e adiando o preenchimento de outras. Para realizar isso de forma eficaz em Python, é fundamental o uso da instrução `pass`, que é o tema deste artigo.

O que é a Declaração ‘Pass’?

Diferentemente da maioria das palavras-chave que instruem o interpretador a executar uma ação, a instrução `pass` se destaca por ordenar ao interpretador que não faça nada. Ela é empregada dentro de blocos de código.

Blocos de código em Python são identificados por linhas de código indentadas, presentes em funções, classes ou estruturas de controle de fluxo. As estruturas de controle de fluxo são mecanismos que alteram o fluxo de execução normal de um programa, desviando o curso através de condicionais ou repetindo a execução de blocos de código através de loops. As palavras-chave de controle de fluxo comuns em Python são `if`, `for` e `while`.

A Necessidade da Declaração ‘Pass’

Como mencionado, a instrução `pass` é uma instrução que não realiza nenhuma ação. Mas por que precisaríamos de uma instrução que não faz nada ao construir um programa que faz algo? Nesta seção, serão apresentados os casos de uso da instrução `pass`.

#1. Marcador para Implementação Futura

Conforme mencionado na introdução, ao programar, é útil adotar a estratégia de “dividir para conquistar”. Por exemplo, ao criar uma função, pode-se querer definir o cabeçalho da função e reservar o desenvolvimento do corpo da função para mais tarde.

No entanto, o interpretador Python irá sinalizar um erro se você tentar executar o código. Isso acontece porque o Python espera que o corpo de uma função, ou qualquer bloco de código, contenha pelo menos uma instrução. Veja um exemplo de função em um arquivo Python:

def minha_funcao():
    # O código será escrito depois
    # Por enquanto, não há instruções

Se tentarmos executar esse código, um erro de sintaxe será gerado, algo como:

File "<ipython-input-1-58189b01193e>", line 3
    # Por enquanto, não há instruções
                                     ^
SyntaxError: incomplete input

Nossa estratégia de dividir para conquistar não funciona se escrevermos tudo antecipadamente, mas o Python exige que pelo menos algo seja escrito. A instrução `pass` resolve esse problema. Ela é tecnicamente uma instrução, então, se você a incluir em um bloco, o Python não gerará um erro. E, ainda assim, ela não realiza nenhuma ação, eliminando a preocupação com a lógica da função. Aqui está a função anterior com a instrução `pass`.

def minha_funcao():
    # O código será escrito depois
    # Por enquanto, temos apenas a instrução pass
    pass

Agora, ao executar o código, nenhum erro será gerado.

Você também pode chamar a função para confirmar que ela não executa nenhuma ação.

Essencialmente, este é o principal uso da instrução `pass` em Python: como um espaço reservado para blocos de código vazios. Isso se aplica não apenas a funções, mas também a condicionais, loops e classes.

#2. Implementando Classes Abstratas e Interfaces

A instrução `pass` também pode ser usada na implementação de classes abstratas. Uma classe abstrata é uma classe que define métodos abstratos, sendo que um método abstrato é um método declarado, mas não implementado. Este uso é similar ao caso anterior, em que a instrução `pass` é um espaço reservado. No entanto, diferentemente do caso anterior, onde a instrução `pass` era temporária, aqui ela é permanente.

Classes abstratas servem como classes base que definem os métodos que as subclasses devem implementar. Classes abstratas não contêm nenhuma lógica; elas simplesmente definem os métodos que compõem as classes que herdam delas. Como resultado, você não instancia uma classe base diretamente.

Em Python, utiliza-se o decorador `@abstractmethod` e a classe `ABC`, definidas no pacote `abc`, para criar classes abstratas. Caso você não esteja familiarizado com decoradores, consulte um artigo sobre decoradores em Python.

Conforme mencionado, o pacote `abc` define o decorador `@abstractmethod` e a classe `ABC`, que podem ser utilizadas da seguinte forma:

from abc import (abstractmethod, ABC)

class ClasseBase(ABC):

    @abstractmethod
    def metodo_base(self):
        # metodo_base é um método que qualquer superclasse de ClasseBase deve implementar
        # Aqui, definimos o método, mas não o implementamos
        # Usamos a instrução pass no corpo para que o código seja válido
        pass

`ClasseBase` herda da classe `ABC`. Além disso, o decorador `@abstractmethod` é aplicado a `metodo_base`. Agora, você pode herdar desta classe e implementar `metodo_base`.

class ClasseDerivada(ClasseBase):
    def metodo_base(self):
        print("Olá do método base definido")

Você pode instanciar esta classe e testar `metodo_base`.

meu_objeto = ClasseDerivada()

meu_objeto.metodo_base()

Ao executar este código, você verá a mensagem impressa na tela.

Olá do método base definido

#3. Não Fazer Nada com Exceções Capturadas

Quando um programa Python encontra um erro, ele gera uma exceção. Exceções são disruptivas, pois fazem com que o programa pare de executar e seja interrompido. No entanto, é possível capturar e manipular exceções para evitar que o programa falhe. A instrução `pass` pode ser utilizada quando você não quer realizar nenhuma ação específica para lidar com o erro. Veja um exemplo:

try:
    # código que irá gerar uma exceção
    raise Exception('Alguma exceção')
except:
    pass

Ao executar o código acima, nada acontece. Isso ocorre porque a exceção é gerada e tratada pelo código no bloco `except`. Contudo, este código não realiza nenhuma ação, então nada acontece. Normalmente, ao lidar com exceções, você gostaria de registrá-las ou manipulá-las de alguma forma. No entanto, se você não deseja realizar nenhuma ação, esta é uma forma de fazer isso.

Como a instrução Pass se difere de Break e Continue?

Outras palavras-chave que você pode encontrar são `break` e `continue`. De forma resumida, explicarei o que elas fazem para que você possa ver como elas diferem da instrução `pass`.

Instrução Break

A instrução `break` é utilizada para interromper a execução de um loop. Todas as iterações subsequentes do loop são canceladas. Por exemplo, suponha que você esteja escrevendo uma função de busca linear. Quando o elemento é encontrado, não há razão para continuar iterando até o final da lista. Faria sentido sair do loop, e é neste caso que se utiliza a instrução `break`. Veja um exemplo de função de busca linear:

def busca_linear(valores, valor_busca):
    for i in range(len(valores)):
        if valores[i] == valor_busca:
            print("Valor encontrado no índice", i)
            break

Instrução Continue

A instrução `continue` é utilizada para pular a iteração atual de um loop. Se você estiver iterando sobre uma lista de números, quando seu programa encontrar uma instrução `continue`, ele interromperá a iteração atual e saltará para a próxima iteração. O loop continua em execução. Veja a seguir um exemplo de uma função que usa a instrução `continue`. O programa dobra todos os números ímpares, portanto, a lista resultante conterá apenas números pares.

def tornar_pares(nums):
    for i in range(len(nums)):
        if nums[i] % 2 == 0:
            # Se o número já for par, saltamos para a próxima iteração usando continue
            continue
        
        # Apenas números ímpares chegarão a este ponto
        # Dobramos o número para que ele se torne par
        nums[i] *= 2

Espera-se que, ao compreender as instruções `break` e `continue`, você possa diferenciá-las da instrução `pass`.

Melhores Práticas para Utilizar a Instrução Pass

✅ Lembre-se de que a instrução `pass` é geralmente utilizada como um substituto temporário; não se esqueça de substituir a instrução `pass` pelo código real quando estiver pronto.

✅ Caso você utilize a instrução `pass` para outro propósito que não seja um espaço reservado temporário, adicione um comentário explicando o motivo de sua presença.

Considerações Finais

Neste artigo, apresentamos a instrução `pass` em Python, uma palavra-chave útil que permite dividir problemas complexos em partes menores ao escrever código. A instrução `pass` também é abordada na documentação oficial do Python.

Em seguida, explore os tipos de erros comuns em Python e como resolvê-los.