Depuração eficaz com a instrução Python Assert

Você é um programador? Nesse caso, a depuração é uma habilidade essencial, independentemente da linguagem em que você está codificando. Neste artigo, você aprenderá como usar a instrução assert em Python para uma depuração eficaz.

Ao trabalhar em um projeto, você definirá vários módulos. Isso inclui funções, definições de classe e muito mais. E você provavelmente encontrará erros ou resultados inesperados devido a um bug na implementação. As instruções assert são úteis na depuração desse código.

Neste tutorial, aprenderemos a sintaxe para usar a instrução assert seguida de exemplos de código para vê-la em ação. Também veremos o que são erros de asserção e como podemos usá-los para corrigir os erros no código durante o desenvolvimento.

Vamos começar!

Como usar a instrução Assert em Python

Aprenderemos a sintaxe para usar a instrução assert e, em seguida, codificaremos alguns exemplos.

Sintaxe da instrução Assert

Vamos começar com a sintaxe para usar a instrução assert em Python:

assert expression, message

Aqui,

  • expression é qualquer expressão Python válida a ser avaliada. Isso pode ser uma condição no valor da variável, valor verdadeiro da variável, valor de retorno de uma função e muito mais.
  • Contanto que a expressão seja avaliada como True, a instrução assert não gera um erro nem retorna nada. Isso indica que o programa funciona conforme o esperado.
  • Se a expressão não for mais True, uma exceção AssertionError será gerada.
  • message é uma string opcional. Você pode especificar uma mensagem que é exibida no rastreamento sempre que uma exceção AssertionError é gerada.

Em seguida, vamos codificar alguns exemplos em que a instrução assert pode nos ajudar a escrever um código mais limpo e sem erros.

  15 melhores ferramentas de monitoramento de rede colocadas em teste em 2020

Você pode encontrar os exemplos de código usados ​​neste tutorial nesta essência do GitHub.

Exemplos de declarações assert do Python

Considere o seguinte exemplo. Digamos que você tenha uma variável de desconto em seu código. Mas você gostaria que seu valor fosse sempre menor ou igual ao max_discount.

Para verificar se você acidentalmente não definiu a variável de desconto para um valor, você pode adicionar uma declaração. A expressão a ser avaliada é: desconto <= max_discount.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Aqui, desconto (20) é menor que max_discount (50). Portanto, a instrução assert não gera nenhum erro.

A exceção AssertionError

Se a variável de desconto for definida com um valor maior que max_discount, uma exceção AssertionError será levantada.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Sabemos que a instrução assert também nos permite especificar uma string de mensagem opcional.

Vamos também usar uma string de mensagem que fornece informações de diagnóstico mais descritivas. Para a instrução assert, vamos adicionar uma f-string do Python que também contém os valores de desconto e max_discount.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

Conforme visto na célula de saída acima, a exceção AssertionError agora inclui os valores das variáveis ​​de desconto e max_discount.

Depurando e testando funções Python com Assert

Ao definir funções, às vezes você pode introduzir inadvertidamente bugs (erros lógicos) que impedirão que sua função funcione conforme o esperado.

Vamos dar um exemplo. Suponha que haja um teste em uma classe e os alunos tenham a chance de tentar uma pergunta bônus. Qualquer aluno que tentar fazer a pergunta bônus receberá 10 pontos adicionais no teste. 😄

  Tudo o que você precisa saber sobre coautoria no Excel

Considere a seguinte função get_final_score:

  • Leva em uma pontuação atual, pontuação e um bônus booleano.
  • Se um aluno respondeu à pergunta de bônus, o bônus booleano é Verdadeiro e ele recebe 10 pontos a mais do que sua pontuação atual.
  • A função então retorna a pontuação final.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Vamos fazer algumas chamadas para a função. Vemos que para pontuações de 34 e 40 com bônus definido como Verdadeiro e Falso, as pontuações finais são 44 e 40, respectivamente.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

No entanto, o máximo de pontos no teste é, digamos, 50. Portanto, se um aluno pontuar 49 e também responder à pergunta bônus, a função get_final_score calculará alegremente a pontuação final como 59.

print(get_final_score(49,True))
# 59

Tecnicamente, é possível. Mas suponhamos que um aluno não consiga obter mais do que o máximo de pontos possíveis para o teste. 🙂

Então, vamos inicializar uma variável max_score. E capture a pontuação retornada da função na variável final_score.

Posteriormente adicionamos uma asserção que verifica se o final_score é menor que o max_score.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

Agora obtemos uma exceção AssertionError para a chamada de função get_final_score(47,True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

Agora adicionamos uma string f descritiva à instrução assert do Python:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

Modificando a Função

Vamos voltar e modificar a definição da função get_final_score para corrigir o comportamento inesperado:

  • A função get_final_score também usa max_score como parâmetro.
  • Verificamos se o bônus é verdadeiro. Se True, adicionamos 10 pontos à variável de pontuação.
  • Em seguida, verificamos se score é maior que max_score. Nesse caso, retornamos max_score.
  • Caso contrário, retornamos pontuação.
  Como remover marca d'água no Microsoft Word

Agora garantimos que a pontuação final seja sempre menor ou igual a max_score.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Como um exercício rápido, escreva algumas asserções para confirmar que a função agora funciona conforme o esperado.

Uma observação sobre a exceção AssertionError

Embora uma exceção AssertionError ocorra quando a expressão for avaliada como False, devemos nos lembrar de não tratar esses erros como exceções. Significa que não devemos fazer algo assim:

try:
    <doing this>
except AssertionError:
    <do this>

No exemplo anterior em get_final_score, usamos a asserção para verificar se final_score é menor que max_score. Em seguida, modificamos a definição da função para que não haja erros de asserção.

É para isso que servem as afirmações. Eles são verificações de integridade do código e ajudam a escrever um código mais limpo. O tratamento de exceções, por outro lado, é antecipar e tratar erros inesperados em tempo de execução. Geralmente, incluem tipos e valores de entrada inválidos.

Para resumir, você deve usar a instrução assert do Python para depuração eficaz e não manipular AssertionErrors como exceções.

Conclusão

Este tutorial ajudou você a entender como usar a instrução assert em Python. Aqui está um resumo do que você aprendeu:

  • As instruções assert do Python (assertions) assumem a forma de expressão assert. Isso verifica se a expressão é verdadeira. Se não for avaliado como True, uma exceção AssertionError será lançada.
  • Você também pode usar o assert com a expressão assert de sintaxe, message. Isso imprimirá a string da mensagem sempre que ocorrer uma exceção AssertionError.
  • Você deve se lembrar de não implementar tratamento de exceção para lidar com erros de asserção. E use asserções como uma ferramenta de depuração útil para verificações de sanidade do seu código.

Como desenvolvedor, as asserções ajudam na depuração. Para garantir que todos os componentes individuais (módulos) do projeto funcionem conforme o esperado, você pode aprender a escrever testes de unidade em Python.

Em seguida, confira esta lista de projetos Python iniciantes nos quais você pode trabalhar.