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.
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. 😄
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.
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.