My Rock, Paper, Stone

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
__blackjack__
User
Beiträge: 13063
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Jain, also man kann statt ``assert condition, message`` auch ``if __debug__ and condition: raise AssertionError(message)`` schreiben, aber da sieht man auch gleich den Nachteil: es ist deutlich länger/mehr zu schreiben.

``assert`` und ``raise`` haben andere Einsatzgebiete. ``assert`` ist nur für Sachen wo ganz klar der *Programmierer* einen Fehler gemacht hat. Und da darf nichts stehen was den Programmzustand beeinflusst, weil ``assert`` auch global abgeschaltet werden kann. Auch wenn das in Python eigentlich niemand macht. In anderen Programmiersprachen ist das üblicher, insbesondere bei welchen die explizit kompiliert werden.

``assert`` ist nur für diese eine ganz bestimmte Art von Fehlern, wo man etwas prüft was eigentlich nie passieren dürfte. Das heisst auf Deutsch „Zusicherung“. Das ist für Programmzustände die nicht sein dürften, weil man davor entweder so programmiert hat, dass das ausgeschlossen ist, oder aber schon mit regulären Ausnahmen signalisiert hat, dass da was falsch war. ``assert`` ist beispielsweise nicht zum prüfen von Funktionsargumenten geeignet, denn da weiss man ja in der Regel nicht wer für falsche Werte verantwortlich ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du @andie39 machst hier einen kategorischen Fehler: assert ERZEUGT einen Fehler. Weil man das will, das der entsteht, statt stillschweigend einen Fehler zu ignorieren.

try & behandeln Fehler. Das ist das genaue Gegenteil.

Und auf die Gefahr hin Korinthen zu kacken : try/except/finally sind keine Funktionen. Sondern statements. Das ist wichtig, weil Funktionen etwas anderes sind.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Naja. Statt assert „FehlerMeldung“
gibt es hier ja:

try „die Funktion die ausgeführt werden soll“

except: „Mache Meldung xy“

Prinzipiell aber doch ähnlich:
Wenn eben die try funktion aus irgendwelchen Gründen nicht mehr läuft wirf er ja die except
meldung aus.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Fundamental nicht. Ohne assert gibt es keinen Fehler. Also wird da auch nix gemeldet.
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Ok. Dann würde man try und except bei Fehlern geben die man erwarten kann.
Beispielsweise wenn eine Zahl eingegeben werden soll, man aber ausgehen muss das ein Wort eingegeben wird.

Dann würde man try laufen lassen wenn eine Zahl eingegeben wird und falls das nicht der Fall ist except.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@andie39: Genau, das würde dann ungefähr so aussehen:

Code: Alles auswählen

def read_number(prompt, type_=int):
    while True:
        maybe_number = input(prompt)
        try:
            return type_(maybe_number)
        except ValueError:
            print(f"please enter a number, not {maybe_number!r}")


def main():
    entered_int = read_number("Please enter an integer: ")
    print(f"{entered_int} + 2 = {entered_int + 2}")
    entered_float = read_number("Please enter a decimal number: ", float)
    print(f"{entered_float} / 3 = {entered_float / 3}")


if __name__ == "__main__":
    main()

Code: Alles auswählen

Please enter an integer: foo
please enter a number, not 'foo'
Please enter an integer: 42
42 + 2 = 44
Please enter a decimal number: 2.7
2.7 / 3 = 0.9
Benutzeravatar
andie39
User
Beiträge: 152
Registriert: Dienstag 7. Dezember 2021, 16:32

Verstanden, ich musste den Code mehrfach schauen aber dann habe ich es verstanden.

Hätte ich den so selber bauen wollen, für die paar Zeilen hätte ich ne Weile gebraucht weil bestimmte Ausdrücke unbekannt sind und die erst hättr googlen müssen…
Antworten