Eu estou tentando gerar um aviso em Python sem fazer o programa travar / parar / interromper.
Eu uso a seguinte função simples para verificar se o usuário passou um número diferente de zero para ele. Nesse caso, o programa deve avisá-los, mas continue conforme o normal. Ele deve funcionar como o código abaixo, mas deve usar a classe ou Warning()
, em vez de imprimir o aviso manualmente.Error()
Exception()
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Se eu usar o código abaixo e passar 0 para a função, o programa trava e o valor nunca é retornado. Em vez disso, quero que o programa continue normalmente e apenas informe ao usuário que ele passou 0 para a função.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Quero poder testar se um aviso foi lançado testando-o por unittest. Se eu simplesmente imprimir a mensagem, não poderei testá-la com assertRaises em um ponto.
fonte
print
a mensagem?Respostas:
Você não deveria
raise
avisar, deveria estar usando owarnings
módulo. Ao aumentá-lo, você está gerando erro, em vez de aviso.fonte
warnings.catch_warnings
gerenciador de contexto que permitirá que você faça isso.Veja a documentação do python: aqui
fonte
warnings.warn("blabla", DeprecationWarning)
por adicionar uma classe ao tipo de aviso que está sendo emitidoPor padrão, diferente de uma exceção, um aviso não interrompe.
Depois
import warnings
, é possível especificar uma classe Warnings ao gerar um aviso. Se um não for especificado, é literalmenteUserWarning
por padrão.Para simplesmente usar uma classe preexistente, por exemplo
DeprecationWarning
:Criar uma classe de aviso customizada é semelhante a criar uma classe de exceção customizada:
Para testar, considere
assertWarns
ouassertWarnsRegex
.Como alternativa, especialmente para aplicativos independentes, considere o
logging
módulo. Ele pode registrar mensagens com um nível de depuração , informações , aviso , erro , etc. mensagens Entrar com um nível de aviso ou superior são, por padrão, impressas no stderr.fonte