Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

isOperand-funksjonen har en svakhet, nemlig at den gjetter at argumentet er et tall utelukkende på grunnlag av første tegn. En litt bedre implementasjon bruker float-funksjonen for å sjekke om konverteringen går. Denne teknikker er forøvrig foreslått i følgende stackoverflow-spørsmål: http://stackoverflow.com/questions/354038/how-do-i-check-if-a-string-is-a-number-in-python 

Code Block
languagepython
def isOperand(token):
    try:
        float(token)
        return True
    except ValueError:
        return False

Denne isOperand-implementasjonen sjekker om token er et gyldig desimaltall ved å kalle float og se om den utløser et såkalt unntak (tilsvarende å kræsje). Ved å bruke try-except-konstruksjonen så unngår en at programmet kræsjer og kan returnere True dersom det ikke utløses noe unntak og False dersom det gjør.

Konstruksjonen try-except fungerer omtrent slik: Koden mellom try og except kjøres som vanlig, men hvis det underveis utløses et unntak av typen angitt i except-delen (her: unntakstypen ValueError), så kan det fanges opp og koden i except-delen kjøres, før koden etter try-except kjører som normalt. (Akkurat her returneres jo en verdi i begge tilfeller, så det er ikke noe kode etter try-except-konstruksjonen.)

I dette tilfellet vil en normal utførelse, hvor float returnerer en verdi (som brukes ikke i dette tilfellet ikke brukes), gjøre at return True bli utført. Dersom unntak utløses fordi float ikke gjenkjenner token som et (desimal)tall, så blir return False utført.

...

I rpncalc2.py så definerte vi hasOperands, som sa om det var nok operander på stackeni operands-lista. Dersom så var tilfelle, så ble de i praksis pop-et rett etterpå. I dette eksemplet så velger vi å gjøre begge deler i samme funksjon, kalt popOperands. Funksjonen vil altså pop-e fjerne og returnere n operander, dersom det er nok av dem, ellers returnere returneres en verdi som angir "ingenting".

...

Som nevnt over i forklaringen til pushOperand, så kan det være et poeng at all tilgang til en datastruktur som operands-lista skjer gjennom definerte funksjoner. Dette gir litt bedre oversikt over hvor i koden operands leses eller endres, og gjør feilsøking enklere. Det gjenstår nå bare én setning i while-løkka som leser eller endrer operands, nemlig hvilken? ?? Finn den du, og definer og bruk en passende funksjon!

...