Ik heb een functie die een van de volgende drie dingen kan retourneren:
- succes (
True
) - mislukking (
False
) - fout bij lezen/parseren van stream (
None
)
Mijn vraag is, als ik niet mag testen tegen True
of False
, hoe moet ik dan zien wat het resultaat is. Hieronder is hoe ik het momenteel doe:
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"
is het echt zo simpel als het verwijderen van het == True
gedeelte of moet ik een tri-bool datatype toevoegen. Ik wil niet dat de functie simulate
een uitzondering genereert, omdat ik alleen wil dat het buitenste programma met een fout logt en doorgaat.
Antwoord 1, autoriteit 100%
Wees niet bang voor de uitzondering! Uw programma gewoon laten inloggen en doorgaan is net zo eenvoudig als:
try:
result = simulate(open("myfile"))
except SimulationException as sim_exc:
print "error parsing stream", sim_exc
else:
if result:
print "result pass"
else:
print "result fail"
# execution continues from here, regardless of exception or not
En nu kunt u een veel uitgebreider type melding krijgen van de simulatiemethode over wat er precies mis is gegaan, voor het geval u fout/geen fout niet informatief genoeg vindt.
Antwoord 2, autoriteit 95%
if result is None:
print "error parsing stream"
elif result:
print "result pass"
else:
print "result fail"
houd het simpel en expliciet. Je kunt natuurlijk vooraf een woordenboek definiëren.
messages = {None: 'error', True: 'pass', False: 'fail'}
print messages[result]
Als u van plan bent uw functie simulate
aan te passen om meer retourcodes op te nemen, kan het onderhouden van deze code een probleem worden.
De simulate
kan ook een uitzondering op de parseerfout veroorzaken, in welk geval je het hier zou opvangen of het een niveau hoger zou laten propageren en de afdrukbit zou worden teruggebracht tot een één -regel if-else-instructie.
Antwoord 3, autoriteit 11%
Zeg nooit, nooit, nooit
if something == True:
Nooit. Het is gek, omdat je redundant herhaalt wat redundant is gespecificeerd als de redundante voorwaarderegel voor een if-statement.
Erger nog, zeg nooit, nooit, nooit
if something == False:
Je hebt not
. Voel je vrij om het te gebruiken.
Ten slotte is het inefficiënt om a == None
te doen. Doe a is None
. None
is een speciaal singleton-object, er kan er maar één zijn. Controleer gewoon of je dat object hebt.
Antwoord 4, autoriteit 5%
Er zijn veel goede antwoorden. Ik wil er nog een punt aan toevoegen. Er kan een fout in uw code komen als u met numerieke waarden werkt en uw antwoord is toevallig 0.
a = 0
b = 10
c = None
### Common approach that can cause a problem
if not a:
print(f"Answer is not found. Answer is {str(a)}.")
else:
print(f"Answer is: {str(a)}.")
if not b:
print(f"Answer is not found. Answer is {str(b)}.")
else:
print(f"Answer is: {str(b)}")
if not c:
print(f"Answer is not found. Answer is {str(c)}.")
else:
print(f"Answer is: {str(c)}.")
Answer is not found. Answer is 0.
Answer is: 10.
Answer is not found. Answer is None.
### Safer approach
if a is None:
print(f"Answer is not found. Answer is {str(a)}.")
else:
print(f"Answer is: {str(a)}.")
if b is None:
print(f"Answer is not found. Answer is {str(b)}.")
else:
print(f"Answer is: {str(b)}.")
if c is None:
print(f"Answer is not found. Answer is {str(c)}.")
else:
print(f"Answer is: {str(c)}.")
Answer is: 0.
Answer is: 10.
Answer is not found. Answer is None.
5
Ik ben van mening dat het gooien van een uitzondering een beter idee is voor uw situatie. Een alternatief is de simulatiemethode om een tuple terug te zetten. Het eerste item is de status en de tweede het resultaat:
result = simulate(open("myfile"))
if not result[0]:
print "error parsing stream"
else:
ret= result[1]