Hoe moet ik in Python testen of een variabele Geen, Waar of Onwaar is

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 Trueof 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 == Truegedeelte of moet ik een tri-bool datatype toevoegen. Ik wil niet dat de functie simulateeen 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 simulateaan te passen om meer retourcodes op te nemen, kan het onderhouden van deze code een probleem worden.

De simulatekan 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 == Nonete doen. Doe a is None. Noneis 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]

Other episodes