Seite 1 von 1

Kann Variable nicht als Parameter im json request nutzen

Verfasst: Mittwoch 11. Januar 2023, 03:56
von spa1teN
Moin,
ich bin ziemlicher Anfänger, ist wahrscheinlich n doofer Fehler:

Ich möchte eine while loop bauen, die aus einer API erst die Anzahl der Datenpfade (ich hoffe was gemeint ist, kenne die Fachtermini nicht :)) bestimmen, dann eine Variable gegen diese Anzahl laufen lassen und aus jedem Pfad jeweils Daten ziehen und diese Auflisten:

Code: Alles auswählen

i = 0
len = (len(resp["vorgangsbezug"][0]))
top = ""
while i <= len:
	top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
	i += 1
Dabei erhalte ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/plenar/projekt/plenarbot.py", line 32, in <module>
    top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
IndexError: list index out of range
Wenn ich statt i z.B. 0 einsetze funktioniert das ganze, aber ich habe len mal dieselben Daten untereinander. Kann da wer helfen?
Liebe Grüße

Re: Kann Variable nicht als Parameter im json request nutzen

Verfasst: Mittwoch 11. Januar 2023, 08:24
von Sirius3
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Listen fangen mit Index 0 an und laufen dann bis Länge - 1, Du gehst aber bis zur Länge, und wenn ich das richtig sehe, auch noch bis zur falschen Länge (die vom 0ten Element). Die eingebaute Funktion `len` überdeckst Du mit der Variable `len`. Das geht hier nur gut, weil Du nur einmal `len` benutzt, und alle Deine Variablen globale Variablen sind. Sollte man aber trotzdem nicht machen.
Statt einer while-Schleife würde man eine for-Schleife verwenden.

Code: Alles auswählen

length = len(resp["vorgangsbezug"])
top = ""
for i in range(length):
    top = top + "-" + resp["vorgangsbezug"][i]["titel"] + " (" + resp["vorgangsbezug"][i]["vorgangstyp"] + ")\n"
Über einen Index iteriert man aber nicht, weil man über die Elemente der Liste direkt laufen kann:

Code: Alles auswählen

top = ""
for vorgangsbezug in resp["vorgangsbezug"]:
    top = top + "-" + vorgangsbezug["titel"] + " (" + vorgangsbezug["vorgangstyp"] + ")\n"
Statt Strings mit + zusammenzustückeln benutzt man Formatstrings:

Code: Alles auswählen

top = ""
for vorgangsbezug in resp["vorgangsbezug"]:
    top += f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n'
Und statt Strings immer wieder zu verlängern, benutzt man str.join:

Code: Alles auswählen

top_elemente = []
for vorgangsbezug in resp["vorgangsbezug"]:
    top_elemente.append(f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n')
top = "".join(top_elemente)
Und jetzt könnte man noch einen Generatorausdruck verwenden:

Code: Alles auswählen

top = "".join(
    f'-{vorgangsbezug["titel"]} ({vorgangsbezug["vorgangstyp"]}\n'
    for vorgangsbezug in resp["vorgangsbezug"]
)

Re: Kann Variable nicht als Parameter im json request nutzen

Verfasst: Donnerstag 12. Januar 2023, 03:42
von spa1teN
Dankesehr, das hat sehr geholfen. Das meiste was da steht habe ich glaube ich auch verstanden :)
Wie gesagt, bin halt Anfänger und will dazulernen.