Wo liegt der Fehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
steve99
User
Beiträge: 1
Registriert: Montag 30. Oktober 2023, 17:19

Kann mir jemand helfen? Die Funktion hat zuvor schon funktioniert, jetz bekomme ich aber immer diesen Fehler. Chat GPT gibt auch nichts sinnvolles von sich.

import random

#Liste der Kategorien mit den zugehörigen Werten
durchflusskategorien = [("MJNQT", 812), ("MQ", 1845), ("HQ1", 5150), ("HQ5", 6620), ("HQ30", 10050), ("HQ100", 11170)]

#zufällig generierter integer zur Überprüfung
q_durchflussrate = random.randint(812, 12000)
print(q_durchflussrate)

#Union wird importiert um dem Parameter q die 2 types float und int zuzuweisen
from typing import Union

#Definieren der Funktion
def q_kategorie(q: Union[float, int], kat: list):
"""Funktion, die eine Durchflussrate (type: float oder int) übernimmt und einer Durchflusskategorie
aus einer Liste mit Tupeln aus Kategorienamen (type: str) und Durchflussrate zuordnet.

Die Schleife for i in range(len(kat)) dient dazu, durch die Elemente (Paare) in der Liste kat zu iterieren.
Die Schleife durchläuft alle Elemente der Liste kat nacheinander, wobei i die Position des aktuellen Elements
in der Liste darstellt.

if i < len(kat) - 1: Stellt sicher, dass das Ende der Liste nicht erreicht wird.
kat[1] <= q: Ob der Wert des i-ten Elements aus der Liste kleiner oder gleich q ist.
kat[i + 1][1] > q: Ob der Wert des darauffolgenden Elements größer als q ist.
Sind diese 3 Bedingungen gegeben gibt die Funktion mit return kat[0] die Kategorie des i-ten Elements
als String aus.

Danach werden mit except 2 Fehler abgefangen, die entstehen, wenn die Parameter der Funktion nicht die
richtigen Datentypen besitzen. Zum Schluss folgt raise."""
try:
for i in range(len(kat)):
if i < len(kat) - 1 and kat[1] <= q and kat[i + 1][1] > q:
return kat[0]
except TypeError:
print("TypeError")
except IndexError:
print("IndexError")
raise

#Verwenden der Funktion
q_kategorie(q_durchflussrate, durchflusskategorien)

Fehler:

Traceback (most recent call last):

File /opt/conda/lib/python3.10/typing.py:668 in __init__
code = compile(arg, '<string>', 'eval')

File <string>:1
26.10.2023
^
SyntaxError: invalid syntax


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File /opt/conda/lib/python3.10/site-packages/IPython/core/interactiveshell.py:3508 in run_code
exec(code_obj, self.user_global_ns, self.user_ns)

Cell In[132], line 19
def q_kategorie(q: Union[float, int], kat: list):

File /opt/conda/lib/python3.10/typing.py:309 in inner
return cached(*args, **kwds)

File /opt/conda/lib/python3.10/typing.py:403 in __getitem__
return self._getitem(self, parameters)

File /opt/conda/lib/python3.10/typing.py:515 in Union
parameters = tuple(_type_check(p, msg) for p in parameters)

File /opt/conda/lib/python3.10/typing.py:515 in <genexpr>
parameters = tuple(_type_check(p, msg) for p in parameters)

File /opt/conda/lib/python3.10/typing.py:164 in _type_check
arg = _type_convert(arg, module=module, allow_special_forms=allow_special_forms)

File /opt/conda/lib/python3.10/typing.py:142 in _type_convert
return ForwardRef(arg, module=module, is_class=allow_special_forms)

File /opt/conda/lib/python3.10/typing.py:670 in __init__
raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")

File <string>
SyntaxError: Forward reference must be an expression -- got '26.10.2023'
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schmeiß die Typannotationen weg, die bringen eh wenig bis gar nichts.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Deine Entwicklungsumgebung (welche auch immer das ist) macht komische Dinge. Der Code läuft so wie er ist mit einer aktuellen Python-Version problemlos durch.
Sirius3
User
Beiträge: 17788
Registriert: Sonntag 21. Oktober 2012, 17:20

Was sollen die q_-Präfixe? Variabelnnamen sollten nicht zum Rätseln einladen.
Kommentare sollten einen Mehrwert bieten, Kommentare wie "Definieren der Funktion" sind nutzlos.
Über einen Index iteriert man nicht.
Importe stehen immer am Anfang der Datei.
Über einen Index iteriert man nicht (und wenn, dann nicht eins zu weit, um das dann nachträglich per if abzufangen), sondern benutzt in diesem Fall einfach itertools.pairwise.
Wenn der Durchflusswert außerhalb der Grenzen der Kategorie liegt, wird implizit None zurückgegeben, das sollte man explizit machen.
Ein TypeError wäre in dieser Funktion ein Programmierfehler und kann nicht sinnvoll abgefangen werden, ein IndexError sollte nicht auftreten. Den TypeError einfach zu ignorieren ist auf jeden Fall falsch.
Das Hauptprogramm steht in einer Funktion mit Namen main:

Code: Alles auswählen

import random
from itertools import pairwise

DURCHFLUSS_KATEGORIEN = [
    ("MJNQT", 812)
    ("MQ", 1845),
    ("HQ1", 5150),
    ("HQ5", 6620),
    ("HQ30", 10050),
    ("HQ100", 11170),
]

def finde_kategorie(durchflussrate, kategorien):
    for kategorie, next_kategorie in pairwise(kategorien):
        if kategorie[1] <= durchflussrate < next_kategorie[1]:
            return kategorie[0]
    return None

def main():
    durchflussrate = random.randint(812, 12000)
    print(durchflussrate)
    kategorie = finde_kategorie(durchflussrate, DURCHFLUSS_KATEGORIEN)
    print(kategorie)


if __name__ == "__main__":
    main()
An irgendeiner Stelle hast Du die eingebauten Typen `float`, `int` oder `list` mit dem String "26.10.2023" überschrieben, was natürlich dann dazu führt, dass die Typprüfung auf diesen ›Typ‹ fehlschlägt.
Antworten