Verliere Inhalt einer Variable

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
Avarion
User
Beiträge: 3
Registriert: Dienstag 14. August 2018, 11:47

Dienstag 14. August 2018, 12:11

Moin Moin,

Ich habe vor zwei, drei Tagen mit einem kleinen Projekt angefangen und stoße aktuell an ein merkwürdiges Problem. Ich verwende eine globale Variable welche ich in einer Funktion ändere. Obwohl ich die Variable in der Funktion als Global deklariere verschwinden die Änderungen jedoch.

Ich weiss das globale Variablen als schlechter Stil gelten, jedoch gelingt es mir nicht sie so vernünftig an die Funktion durchzureichen (und anschliessend wieder zurück) das alles funktioniert.

Aktuell liest das Programm Zugangsdaten zu Testsystemen aus einer Datei aus. Ziel ist das man über das Programm neue Daten zu der Datei hinzufügen kann. Diese soll sich das Programm selber zusammensuchen. Die Datei ist in mehrere Abschnitte aufgeteilt für die verschiedenen Systeme und am Ende steht ein Block mit Konfigurationsinformationen. Das Programm soll die verschiedenen Zugangsdaten in Listen speichern die den Systemen entsprechen und den Konfigurationsbereich einfach übernehmen.

Mein Problem ist, egal was ich mache, die "other" Variable hat am Ende nur die letzte Zeile der Datei. Aus mir nicht bekannten Gründen verliere ich immer alles von den Durchläufen davor.

Ich gehe davon aus das ich hier viel zuviel gepostet habe, aber ich kann nicht sicher sagen welche Information ihr benötigt.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Decription: Programm zur Hinzufügen von Credentials zur access.js

# Mögliche Eingaben via Aufruf: merchantid

# todo: Alles
# todo: Aktuell erst einmal die Merchants in Listen aufnehmen

import sys
from operator import itemgetter


class merchants:
    def __init__(self):
        self.data = ""
        self.merchantlist = []

    def add(self, data):
        # print(data)
        ''''
        todo: prepare aufrufen und gültige Daten übergeben. Sicherstellen das nur Zeilen
        todo: mit Merchantinformationen übergeben werden.
        '''
        if data.startswith('["'):
            self.prepare(data)

    def getall(self):
        return(self.merchantlist)

    def prepare(self,prepstring):
        string = prepstring[prepstring.find('"')+1:]
        string = string[:string.find('"')]
        self.merchantlist.append(string.split("|"))
        # print(string)
        # todo: Fehlerprüfung einbauen
        # todo: Rückgabe der Daten



def fillVariables(lineFromFile, state):
    global other
    if state == "other":
        # other = other + lineFromFile
        # print(lineFromFile)
        # print other
        other += lineFromFile
    elif state == "test":
        test.add(lineFromFile)
    elif state == "staging":
        staging.add(lineFromFile)
    elif state == "vagrantStaging":
        vagrantStaging.add(lineFromFile)
    elif state == "vagrantLocal":
        vagrantLocal.add(lineFromFile)
    else:
        print("Error!!! Wrong state: " + state)
        sys.exit("1")


def readFile():
    state = "neutral"
    f = open('/home/myfolder/Documents/testsystem/access.js', 'r')
    for line in f:
        line = line.rstrip('\n')
        line = line.lstrip('\t ')


        #print(line)
        if line.startswith("const test"):
            state = "test"
        elif line.startswith("const staging"):
            state = "staging"
        elif line.startswith("const vagrantStaging"):
            state = "vagrantStaging"
        elif line.startswith("const vagrantLocal"):
            state = "vagrantLocal"
        elif line.startswith("// Areas"):
            state = "other"
        fillVariables(line, state)
    return()


test = merchants()
staging = merchants()
vagrantStaging = merchants()
vagrantLocal = merchants()
other = ""


readFile()
print("Test: " + str(sorted(test.getall(), key=itemgetter(0))))
print("Staging: " + str(sorted(staging.getall(), key=itemgetter(0))))
print("VagrantStaging: " + str(sorted(vagrantStaging.getall(), key=itemgetter(0))))
print("VagrantLocal: " + str(sorted(vagrantLocal.getall(), key=itemgetter(0))))
print(other)
Sirius3
User
Beiträge: 8593
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 14. August 2018, 12:35

So wie es aussieht, versuchst Du Javascript Code zu parsen. Gibt es da keine bessere Möglichkeit, z.B. die Daten als JSON zu speichern?

Die Zeilen, die mit `const` anfangen, werden wohl kaum auch mit `["` anfangen. Die Auftrennung in fillVariables und readFile sieht auf den ersten Blick auch komisch aus, weil Du nur die if-Kaskaden doppelst.

Wirf mal einen Blick auf die Namenskonventionen von Python, Klassen werden Gross geschrieben, Funktionen und Variablen dagegen klein_mit_unterstrich. `self.data` wird in merchants nicht benutzt. getall ist eine Methode, die man nicht braucht, weil man auch direkt auf merchantlist zugreifen könnte. Typen sollte man nicht in Variablennamen schreiben, besser `mearchants` nennen. Die Klasse an sich ist damit auch ziemlich nutzlos, weil sie nur eine Liste enthält, und man damit add/prepare auch als einfache Funktionen schreiben könnte. Statt dessen wäre der ganze globale Zustand in einer Klasse besser aufgehoben. `test`, `staging`, `vagranStaging` und `vagrantLocal` wäre besser in einem Wörterbuch zusammengefasst.

`sys.exit` sollte in einem normalen Programm nicht vorkommen. An dieser Stelle wäre ein RuntimeError besser.

Dein Problem kann ich nicht nachvollziehen. Kannst Du ein Beispiel geben.
Avarion
User
Beiträge: 3
Registriert: Dienstag 14. August 2018, 11:47

Dienstag 14. August 2018, 12:58

Sirius3 hat geschrieben:
Dienstag 14. August 2018, 12:35
So wie es aussieht, versuchst Du Javascript Code zu parsen. Gibt es da keine bessere Möglichkeit, z.B. die Daten als JSON zu speichern?
Leider nein. Ich bin nicht für das Tool zuständig welches auf das File zugreift (glücklicherweise). Kann es also nicht im Format umstellen.

Beispiel:

Am Ende des Files steht folgendes:

Code: Alles auswählen

	"DE",  									// Land
	"EUR" 									// Währung
);
In meiner Variable steht aber trotz des Versuches den Inhalt von lineFromFile hinzuzufügen:
egal ob ich other += lineFromFile oder other = other + lineFromFile verwende.

Und danke für deine restlichen Tipps. Ich versuche sie umzusetzen.
Avarion
User
Beiträge: 3
Registriert: Dienstag 14. August 2018, 11:47

Mittwoch 15. August 2018, 08:29

Ok. Habe das Problem gelöst. Genauer, es gibt garkein Problem. Der Inhalt der Variable ist nicht weg, nur wenn ich die Variable ausgebe zeigt er nur zwei Zeichen an. Len liefert über 1400 zurück. Ist also nur ein Anzeigeproblem.

Seufz.

Danke für die Mühe und ich bin auch schon dabei die Verbesserungsvorschläge umzusetzen.
Antworten