Variablen Nummerieren

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
flori8029
User
Beiträge: 2
Registriert: Samstag 6. Februar 2016, 15:03

Sehr geehrte Webgemeinde,
dies ist mein erster Beitrag hier im Forum, weshalb ich bitte, eventuelle Fehler zu entschuldigen.
Ich habe ein Script zum Abruf von Wetterinformationen aus einer XML-Datei erstellt. Dabei möchte ich die Wetterdaten um 6, 7, 13, 14 und 15 Uhr auslesen. Dafür schrieb ich anfangs folgendes:

Code: Alles auswählen

time_6 = 6 - int(nexttime)
 if time_6 >= 0:
  Himmel_6 = Baum.getElementsByTagName('sky')[int(time_6 + str(Z))].firstChild.data
  Wetterlage_6 + str(Z) = Baum.getElementsByTagName('condition')[int(time_6)].firstChild.data
  Temp_6 = Baum.getElementsByTagName('metric')[(int(time_6) * 9)].firstChild.data
  p_6 = True
 elif time_6 < 0:
  p_6 = False
"time_6" ist hierbei die gewünschte Zeit (6 Uhr) minus "nexttime" (aktuelle Stunde) und wird zur Ermittlung der Position des jeweiligen Wertes verwendet. Bei Himmel und Wetterlage funktioniert dies einwandfrei, bei Temp wird der Multiplikator 9 verwendet, weil da noch einige gleichnamige XML-Tags dazwischenstehen. "p_6" ist ein Indikator. Diese Daten werden dann später ausgegeben.
Soweit funktioniert alles. Ich schreibe den Code also 5x für die gewünschten 5 Uhrzeiten, was ich nun vermeiden möchte. Hier fängt mein Problem an. Ich versuchte, dies mit einer Funktion zu realisieren, so z.B.:

Code: Alles auswählen

def Funktion(Z):
 global "time_" + Z = 6 - int(nexttime)
 if "time_" + Z >= 0:
  "Himmel_" + Z = Baum.getElementsByTagName('sky')[int("time_" + Z)].firstChild.data
  "Wetterlage_" + Z = Baum.getElementsByTagName('condition')[int("time_" + Z)].firstChild.data
  "Temp_" + Z = Baum.getElementsByTagName('metric')[(int("time_" + Z) * 9)].firstChild.data
  "p_" + Z = True
 elif "time_" + Z < 0:
  "p_" + Z = False
  
Funktion(6)
Funktion(7)
Funktion(13)
Funktion(14)
Funktion(15)
Also dass eine Variable erstellt wird, bei welcher das Ende immer durch "Z" bestimmt wird, also ähnlich, wie oben. Dabei gibt Python mir jedoch immer einen Syntax error aus; egal wie ich diese "Verknüpfung" umbaue, es läuft immer auf Syntax error heraus.
Daher würde ich mich sehr freuen, wenn ihr mir helfen könntet, mein Problem zu lösen.

Mit freundlichen Grüßen
flori8029
BlackJack

@flori8029: Du willst keine Variablen nummerieren und schon gar keine nummerierten Variablennamen programmatisch erzeugen.

Und von ``global`` solltest Du auch ganz dringend die Finger lassen. Werte (ausser Konstanten) betreten Funktionen und Methoden als Argumente und verlassen sie als Rückgabewerte. Alles andere wird sehr schnell unübersichtlich, schlecht wart-, test-, und erweiterbar, und ist deshalb auch fehleranfällig.

Für die Funktion mit dem sehr schlechten Namen `Funktion()` müsstest Du also auch `Baum` und `nexttime` als Argumente übergeben. Und dann die Ergebnisse als Rückgabewert an den Aufrufer zurück geben. Der kann das Ergebnis dann beispielsweise in einer Liste oder einem Wörterbuch ablegen, damit man auch beim Aufrufer keine Namen mit angehängten Nummern mehr hat.

Am besten verfrachtest Du erst einmal das Hauptprogramm in eine eigene Funktion. Üblicherweise heisst die `main()`. Dann bist Du gezwungen die Übergabe an Funktionen ordentlich zu machen wenn auf Modulebene keine Variablen mehr existieren.

Das `p_*`-Flag riecht komisch. Hier will man sicher eher eine Ausnahme verwenden statt eines Flags.

Die DOM-API ist übrigens ziemlich hässlich, deswegen gibt es in der Standardbibliothek auch die `ElementTree`-API.

Der Code macht den Eindruck als wenn Du Dich nicht wirklich an der XML-Struktur orientierst, und statt für jeden Datensatz den man haben möchte immer wieder alle Tags mit einem bestimmten Namen zu ermitteln, nur um sich davon dann jedes mal nur *eines* heraus zu greifen, ist ineffizient.

Du hast Da offenbar ein Problem mit Datentypen wenn man sich anschaut wie oft Du zwischen `int()` und `str()` konvertierst.

Und ein Blick in den Style Guide for Python Code kann nicht schaden.
flori8029
User
Beiträge: 2
Registriert: Samstag 6. Februar 2016, 15:03

Danke, @BlackJack, für die schnelle Antwort. Ich vergaß evtl., zu erwähnen, dass ich noch eher Anfänger auf diesem Gebiet bin.
Antworten