Eu tenho uma função que pode retornar uma das três coisas:
- sucesso (
True
) - falha (
False
) - erro ao ler / analisar o fluxo (
None
)
Minha pergunta é: se não devo testar contra True
ou False
, como devo ver qual é o resultado. Abaixo está como eu estou fazendo isso atualmente:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
é realmente tão simples quanto remover a == True
peça ou devo adicionar um tipo de dados tri-bool. Não quero que a simulate
função gere uma exceção, pois tudo o que quero que o programa externo faça com um erro é registrá-lo e continuar.
simulate
função, pego todas as exceções; Não quero que nada que aconteça dentro do simulador pare o restante do programa em execução (e processe o próximo elemento). Mas as respostas estão me fazendo mudar de idéia.simulate
tem coisas que pode capturar e tentar novamente, isso é bom. Mas se "falhar", não deve retornarNone
. Deve apenas gerar uma exceção para o script que o chamou. De qualquer maneira,simulate
está feito. RetornarNone
não é tão útil quanto gerar uma exceção adequada - ou permitir que uma exceção se propaguesimulate
no script de chamada para manipulação.except Exception:
vez disso. Isso captura todos os erros "reais", junto comWarning
eStopIteration
. PermiteKeyboardInterrupt
eSystemExit
através de embora. Se você realmente deseja capturá-los, provavelmente é melhor usar outra tentativa / exceção externa ou alguma outra estrutura que documente claramente sua intenção, pois esses não são "erros". (Mas eu disse "quase nunca" ... talvez no seu caso você realmente queira pegar tudo, e até impedir que o Ctrl-C ou asys.exit()
saída, etc.) seja o que forRespostas:
Não tema a exceção! Ter seu programa apenas registrado e continuado é tão fácil quanto:
E agora você pode ter um tipo de notificação muito mais rico a partir do método simular sobre o que exatamente deu errado, caso você ache que erro / não erro não seja informativo o suficiente.
fonte
traceback.format_exc()
. Veja esta resposta SO.mantenha-o simples e explícito. É claro que você pode pré-definir um dicionário.
Se você planeja modificar sua
simulate
função para incluir mais códigos de retorno, a manutenção desse código pode se tornar um pouco problemática.O
simulate
também pode gerar uma exceção no erro de análise, caso em que você quer iria pegá-lo aqui ou deixá-lo propagar um nível acima e o bit de impressão seria reduzida a uma linha com uma declaração if-else.fonte
Nunca, nunca, nunca diga
Nunca. É uma loucura, já que você repete redundantemente o que é especificado redundantemente como a regra de condição redundante para uma instrução if.
Pior, ainda, nunca, nunca, nunca diga
Você tem
not
. Sinta-se livre para usá-lo.Finalmente, fazer
a == None
é ineficiente. Façaa is None
.None
é um objeto singleton especial, só pode haver um. Basta verificar se você possui esse objeto.fonte
True
não é redundante (embora eu concorde que não é sensato). Pode estar chamando um__eq__
ou outro método especial, que pode fazer praticamente qualquer coisa.if something == True
produzem um resultado diferente do queif something
, por exemplo, para não-booleanosomething
.2==True
produz false enquanto2
avalia como true;None==False
é falso, masnot None
é verdade!something
retornosTrue
sobrebool(something)
. Nesse caso, se você SOMENTE deseja verificar sesomething
tem um valor deTrue
iebool
. Então você tem que fazerif something == True
IMO.Eu gostaria de enfatizar que, mesmo se houver situações em que
if expr :
não seja suficiente, porque se quer ter certeza de queexpr
éTrue
e não apenas diferente de0
/None
/ seja o que for,is
deve ser preferida==
pela mesma razão que S.Lott mencionou para evitar== None
.Na verdade, é um pouco mais eficiente e, mais fácil de entender, mais fácil de ler.
fonte
Acredito que lançar uma exceção é uma ideia melhor para a sua situação. Uma alternativa será o método de simulação para retornar uma tupla. O primeiro item será o status e o segundo o resultado:
fonte
False
for retornado, será impresso'error parsing stream'
.