Seite 1 von 1

Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 08:17
von elmarvo
Hallo zusammen,

ich bekomme für nachfolgende match...case Anweisung einen SyntaxError bei "match operation:".

Kann mir evtl. jemand sagen, was ich falsch mache? Meine Implementierung entspricht imho den Beispielen, die ich bisher im Internet dazu gefunden habe.

Vielen Dank und viele Grüße

PS: Ich nutze Python 3.7.9 in der Thonny IDE

Code: Alles auswählen

def taschenrechner(a, b, operation):
    try:
        a = float(a)
        b = float(b)
        
        match operation:
            case "+":
                return a + b
            case "-":
                return a - b
            case "*":
                return a * b
            case ":":
                return a / b
            case _:
                return "Bitte geben Sie einen gültigen Operator ein.\n(+,-,*,:)"
        
    except ValueError:
        return "Bitte geben Sie zwei Zahlen ein."
    
print(taschenrechner(input("Erste Zahl: "),
                     input("Zweite Zahl: "),
                     input("Operator(+,-,*,:): ")))

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 08:29
von sparrow
Das gibt es frühestens ab Python 3.10 afaik.

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 08:40
von elmarvo
Hey Sparrow,

ich hab noch ergänzt, dass ich Python in der Version 3.7.9 nutze - die Funktionalität müsste daher grundsätzlich gegeben sein.

Magst du vielleicht Mal eben testen, ob du den Fehler bei dir reproduzieren kannst? Vielleicht liegt es ja an meiner IDE...

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 08:42
von Sirius3
Nein, muß es nicht. match gibt es erst ab Python 3.10.

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 08:44
von elmarvo
Ahh okay okay, ich hab 3.1 gelesen!

Ich werd dann Mal auf eine neue Version updaten. :)

EDIT: Jetzt klappt's! 8)

Danke!

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 11:56
von __blackjack__
@elmarvo: Bei dem Programm ist die Programmlogik und die Benutzerinteraktion nicht sauber getrennt. Von einer Funktion die etwas ausrechnet würde man erwarten, dass die Eingaben als Zahlen übergeben werden und nicht als Zeichenketten.

Eine Funktion sollte auch immer nur möglichst einen möglichen Rückgabetyp haben und nicht mal eine Zahl und mal eine Zeichenkette.

Der Fall, dass als zweite Zahl eine 0 und als Operation ":" eingegeben wird, führt zu einer nicht behandelten Ausnahme.

Re: Syntaxfehler mit match...case

Verfasst: Mittwoch 13. April 2022, 16:56
von elmarvo
Hallo Blackjack,

danke für dein Feedback!

Ich hab versucht die Logik und Benutzereingabe besser zu trennen. Auch der Fehler beim Teilen durch 0 wird jetzt erkannt.
Allerdings sieht mir das immer noch zu sehr nach "Gewurschtel" aus :( und ich verstehe nicht, warum er die Schleife nicht verlässt, obwohl ich doch eine break Anweisung drin habe...

Was mache ich falsch? :oops:

Viele Grüße und Danke!

Code: Alles auswählen

def calculate(zahl1, zahl2, operator):
    try:
        match operator:
            case "+":
                return zahl1 + zahl2
            case "-":
                return zahl1 - zahl2
            case "*":
                return zahl1 * zahl2
            case "/":
                return zahl1 / zahl2
            case _:
                return None # kann weg fallen(?)
            
    except ZeroDivisionError:
        return None
        # oder dann doch einen String, wie z. B. "Teilen durch null geht nicht!"
    
def main():
    try:
        zahl1 = float(input("Bitte geben Sie eine Zahl ein."))
        operator = input("Bitte geben Sie einen Rechenoperator ein.")
        zahl2 = float(input("Bitte geben Sie eine weitere Zahl ein."))
        
        operatoren = ["+","-","*","/"]
        
        for o in operatoren:
            print("bin noch in der schleife...")
            if(operator == o):
                print(calculate(zahl1, zahl2, operator))
                falscher_operator = False
                break # warum verlässt er hier die for schleife nicht, wenn ein richtiger operator da ist?
            else:
                falscher_operator = True
                
        if(falscher_operator):
            print("Bitte geben Sie einen gültigen Operator ein.")
            
    except ValueError:
        print("Bitte geben Sie eine gültige Zahl ein.")
        
if __name__ == "__main__":
    main()
EDIT Debugging funktioniert nicht :shock:
ERROR thonny.backend: PROBLEM WITH THONNY'S BACK-END
Traceback (most recent call last):
File "C:\Users\elmarvo\AppData\Local\Programs\Thonny\lib\site-packages\thonny\plugins\cpython\cpython_backend.py", line 1279, in execute_source
statements = compile(root, filename, mode)
ValueError: patterns may only match literals and attribute lookups
... Hilfe :cry: