Fehler: local variable 'neuesGericht' referenced before assignment

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
jlnnnnn
User
Beiträge: 3
Registriert: Montag 27. November 2017, 19:01

Moin, habe zusammengefasst folgende Aufgabe bekommen: Verwalten sie die Speisekarte eines Restaurants. Und dazu eine selbst erstellte Textdatei auslesen, die mehrere Gerichte enthält. Also ich hab Pizza Burger Pommes etc. gemacht aber das ist eher irrelevant.
Das Programm soll folgendes können:
Mit a = Speisekarte anzeigen
n = neues Gericht hinzufügen
l = Gericht löschen
e = Speichern und Porgrammende


Das ganze soll in einem Hauptmenu zu erst erscheinen und es soll nie abstürzen bei Fehleingabe etc.
Ich bin so vorgegangen das ich erstmal die 4 Funktionen geschrieben habe. a und n probieren Problemlos
l und e noch nicht so richtig. Aber das werde ich schon selbst lösen, möchte ja nicht das ihr mein Aufgabe löst :D
Jedenfalls bekomme ich eine Menge Fehlermeldungen seitdem ich das Menu um meine 4 Funktionen gebaut habe.
Es funktioniert lediglich die a Funktion bei allen anderen stürzt das Problem ab.
Als ich das Menu noch nicht hatte ging es reibungslos, auch wenn die Funktionen zum Teil nicht das gemacht haben was sie sollen aber das ist ein anderes Thema...

Fehlermeldung:
Traceback (most recent call last):
File "C:\Users\*****\Desktop\python\ww.py", line 98, in <module>
Hauptmenu()
File "C:\Users\*****\Desktop\python\ww.py", line 86, in Hauptmenu
spNeuesGericht()
File "C:\Users\*****\Desktop\python\ww.py", line 30, in spNeuesGericht
n = neuesGericht
UnboundLocalError: local variable 'neuesGericht' referenced before assignment
Mein Code:

Code: Alles auswählen

file = "speisekarte.txt"
f = open(file, "r+")
f1 = open(file, "r")
speisekarte = f.read()
neuesGericht = f.write
gerichtLöschen = f.write
speichern = f.write
#def a():
	#inputWrite = input("Geben sie ein neues Gericht ein")



	
# Speisekarte Anzeigen lassen

def spAnzeigen():
	a = speisekarte
	anzeigen = input("A Drücken für Speisekarte: ")
	if anzeigen == "a":
		print(speisekarte)
	else:
		print("Gib a ein du Idiot")
	Hauptmenu()

	

# Neues Gericht anzeigen lassen

def spNeuesGericht():
	n = neuesGericht
	neuesGericht = input("N Drücken um ein neues Gericht hinzuzufügen: ")
	if neuesGericht == "n":
		f.write("\n" + input("Geben sie ein neues Gericht ein: "))

"""content = f1.readlines()
print(content)"""



# Gericht löschen

def spGerichtloeschen():
	l = gerichtLöschen
	gerichtLöschen = input("L Drücken um ein Gericht zu löschen: ")
	if gerichtLöschen == "l":
		print("Welche Gericht möchten sie löschen?")
		welchesLöschen = f1.readlines()
		print(welchesLöschen)
		var = input()
		neu = welchesLöschen[int(var)] = ""
		
		print(neu)

"""gerichtWählen = input("Drücken sie eine zahl um ein Gericht zu löschen das 1. Gericht hat die Zahl 0: ")
if gerichtWählen >="0":
	welchesLöschen.removes(gerichtWählen)"""
	
	

# Gericht speichern	

def spGerichtSpeichern():
	e = speichern
	speichern = input("E Drücken um zu speichern: ")
	if speichern == "e":
		f.write(speisekarte)
		print("Erfolgreich gespeichert")
		
	

# Hauptmenu

def Hauptmenu():
	"""Anzeigen = spAnzeigen()
	Neu = spNeuesGericht()
	Löschen = spGerichtloeschen()
	Speichern = spGerichtSpeichern()"""

	menu = input("Bitte geben sie eine Zahl zwischen 1 und 4 an! \n1. Gericht Anzeigen \n2. Neues Gericht \n3. Gericht löschen \n4. Gerichte speichern \nEingabe: ")
	menu2 = int(menu)
	
	
	if str(menu2) == "1":
		spAnzeigen()
	if str(menu2) == "2":
		spNeuesGericht()
	if str(menu2) == "3":
		spGerichtloeschen()
	if str(menu2) == "4":
		spGerichtSpeichern()
	"""if menu == "String":
		print("")
	else:
		print("Bitte geben sie eine Zahl zwischen 1 und 4 an!")
		Hauptmenu()"""
		
		
Hauptmenu()
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

und willkommen im Forum :-)

Das mag jetzt zwar hart klingen, aber: die fehlen definitiv bergeweise Grundlagen in Python, bei so grundlegenden Sachen wie Zuweisung von Variablen, Funktionsaufrufen, Dateioperationen. Dein Code hat so viele Fehler...

Z.B. macht `neuesGericht = f.write` gar nichts, außer, das in `neuesGericht` einen Verweis auf eine Methode enthält. Gespeichert wird da nichts.
Du öffnest eine Datei, schließt sich aber nicht. Damit hast du keine Garantie, dass auch was in die Datei geschrieben wird.
Variablennamen und Funktionsnamen schreibt man in Python klein_mit_unterstrich. Variablen sollten _aussagekräftige_ Namen haben, also nicht so was wie `a` oder so.

Ernst gemeinter Tipp:
* aktuellen Code verwerfen
* 1x in Ruhe das offiziellen Python-Tutorial lesen
* neu anfangen
* alles Schritt für Schritt implementieren und testen
* ggf. macht es noch Sinn, nach jedem Schritt hier im Forum deinen Coe zu zeigen, um dir Tipps und Verbesserungsvorschläge zu holen, bevor du weiter machst.

Gruß, noisefloor
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@jlnnnnn: ich bezweifle, dass irgendeine Funktion jemals funktioniert hat, denn dazu müßtest Du Funktionen geschrieben haben. Eine Funktion bekommt Parameter, mach damit irgendetwas und gibt das Ergebnis zurück. Deine „Funktionen“ haben aber keine Parameter und geben nichts zurück, sind also nur Codeabschnitte mit Namen.

Generell wird immer mit 4 Leerzeichen pro Ebene eingerückt, nicht 3. Variablen und Funktionen werden komplett klein_mit_unterstrich geschrieben. Benutze keine cryptischen Abkürzungen, wie diese `sp`-Präfixe.

Dateien mit dem Modus "r+" zu öffnen ist fast nie sinnvoll, vor allem bei Textdateien muß man generell alles neu Schreiben. `f1` wird nirgend benutzt. Was hast Du gemeint, als Du `neuesGericht`, `gerichtLöschen` und `speichern` an die selbe Methode `f.write` gebunden hast?

In `spAnzeigen` kommt `speisekarte` aus dem Nichts, das sollte also ein Parameter sein. `a` wird nicht benutzt. Was hat `input` in dieser Funktion verloren? `Hauptmenu` sollte hier nicht aufgerufen werden. Funktionen werden aufgerufen und kehren wieder zurück (hier also in die Funktion `Hauptmenu`). Du willst wahrschienlich in `Hauptmenu` eine Schleife benutzen.

In `spNeuesGericht` kommt `neuesGericht` und `f` aus dem Nichts. Zeilen werden normalerweise mit einem `newline` abgeschlossen und nicht damit gestartet. Laut Aufgabe soll bei neuesGericht nicht sofort etwas in die Datei geschrieben werden, sondern erst beim Beenden.

In `Hauptmenu` wandelst Du erst einen String in eine Zahl um sie bei jedem `if` wieder in einen String umzuwandeln. Das ist etwas umständlich. Laut Aufgabenstellung sollst Du auch gar keine Zahlen abfragen.

Der erste Schritt wäre, wirkliche Funktionen zu schreiben. Stell Dir dabei die Frage, welche Datenstruktur für die Gerichte sinnvoll ist. Arbeite dann auf dieser Datenstruktur. Überlege Dir Tests, um die Funktionen zu testen. Erst wenn jede Einzelfunktion funktioniert, mach Dich daran, diese per Menü zu verbinden.
jlnnnnn
User
Beiträge: 3
Registriert: Montag 27. November 2017, 19:01

noisefloor hat geschrieben:Hallo,

und willkommen im Forum :-)

Das mag jetzt zwar hart klingen, aber: die fehlen definitiv bergeweise Grundlagen in Python, bei so grundlegenden Sachen wie Zuweisung von Variablen, Funktionsaufrufen, Dateioperationen. Dein Code hat so viele Fehler...

Z.B. macht `neuesGericht = f.write` gar nichts, außer, das in `neuesGericht` einen Verweis auf eine Methode enthält. Gespeichert wird da nichts.
Du öffnest eine Datei, schließt sich aber nicht. Damit hast du keine Garantie, dass auch was in die Datei geschrieben wird.
Variablennamen und Funktionsnamen schreibt man in Python klein_mit_unterstrich. Variablen sollten _aussagekräftige_ Namen haben, also nicht so was wie `a` oder so.

Ernst gemeinter Tipp:
* aktuellen Code verwerfen
* 1x in Ruhe das offiziellen Python-Tutorial lesen
* neu anfangen
* alles Schritt für Schritt implementieren und testen
* ggf. macht es noch Sinn, nach jedem Schritt hier im Forum deinen Coe zu zeigen, um dir Tipps und Verbesserungsvorschläge zu holen, bevor du weiter machst.

Gruß, noisefloor
Okay, ich werde nochmal von vorne anfangen.
Ich bin halt erstes Semester und das ist meine 4. Aufgabe also ja mir fehlen auf jeden Fall noch Grundlagen.
Für das offizielle Python Tutorial wird mir leider die Zeit fehlen.
Wir haben jede Woche abgaben, und ich habe mal eben nachgeschaut, dass ist recht umfangreich.
Bis jetzt habe ich anhand einer YouTube Serie zum Thema Python mir das lernen bei gebracht und wenn ich mal was genaueres brauchte gegoogelt.
Ich werde deine Tipps auf jeden Fall aufgreifen und sie best möglich umsetzen.

Ich hatte halt folgendes vor.
Ich wollte zu erst diese 4 Teilaufgaben erledigen, werde die jetzt auch nochmal neu schreiben und den Code hier später einreichen, ihr könnt ja sagen ob es bis dahin gut ist.
Danach baue ich das Menu drumherum.
jlnnnnn
User
Beiträge: 3
Registriert: Montag 27. November 2017, 19:01

Bin jetzt gerade wieder beim Anfang

Code: Alles auswählen

_file_ = "speisekarte.txt"
_speisekarte_ = open(_file_, "r")
_speisekarteListe_ = _speisekarte_.readlines()
_speisekarteText_ = _speisekarte_.read()
print(_speisekarteListe_)

# Speikarte Anzeigen

_anzeigen_ = input("Gib a ein um die Speisekarte anzeigen zu lassen: ")
if _anzeigen_ == "a":
	print(_speisekarteText_)

Wenn ich das mache dann gibt es immer nur das print aus Zeile 5 aus.
Also eine Liste.
Wenn ich dann später bei der IF Abfrage bin kommt eine leere Zeile...
Wenn ich Zeile 3 und 5 auskommentiere mit # und dann die Abfrage mache klappt es hmmm
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sage mal wie kommst du immer auf diese Namenskonventionen? Warum denn mit einem mal Unterstriche vor und hinter den Namen?

Und auch hier nutzt du keine Funktionen. Sondern globale Anweisungen. Sollte man sich gar nicht erst angewöhnen. Sondern gleich eine vernünftige main-Funktion schreiben.

Wenn du aus einer Datei die Zeilen gelesen hast, kannst du danach keine weiteren Daten lesen. Die ist dann “durch”. Darum kommt da auch nix bei rum bei dem Print.
Zuletzt geändert von __deets__ am Montag 27. November 2017, 23:08, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@jlnnnnn: woher hast Du jetzt den Quatsch mit den Unterstrichen? Laß die weg.

Dateien kann man, nachdem man sie geöffnet hat, genau einmal lesen. Mit `readlines` wird `_speisekarte_` komplett gelesen, so dass für das nächste `read` nichts mehr zu lesen bleibt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Für das offizielle Python Tutorial wird mir leider die Zeit fehlen.
Das ist ja total Quatsch. Du verschwendest gerade bergeweise Zeit damit, total falschen und nicht lauffähigen Code zu schreiben. Der dann vielleicht (bzw. sehr wahrscheinlich) auch noch zu einer miesen Note führen wird.

Das Python-Tutorial lesen dauert... 2 Stunden? 3 Stunden? Danach hast du aber zumindest die Grundlagen gelesen und (hoffentlich) ein bisschen Verstand.

Habt ihr keine Vorleseungen zu Python? Darin sollte doch normalerweise das behandelt werden, was in der abzugebenden Aufgabe gefordert wird.
Bis jetzt habe ich anhand einer YouTube Serie zum Thema Python mir das lernen bei gebracht
Und das hat wie lange gedauert? In dieser Zeit hättest du ziemlich sicher besser das Python Tutorial gelesen.

Aber letztendlich musst du ja selber wissen, ob du bei dir selber so eine blöde Ausreden wie "keine Zeit" durchgehen lässt oder nicht. Ist ja dein Studium und deine Zukunft, um die es geht.

Gruß, noisefloor
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachdem ich noisefloors ersten Beitrag gelesen habe, schwant mir woher das mit den unterstrichen kommt...
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Ich kapiere noisefloor's neudeutsche Sprachsyntax mit diesen "_" wie zB "_aussagekräftige_" auch nicht. ggf. bin ich auch schon zu alt :mrgreen:
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@lackschuh: wenn Du alt wärst, wüßtest Du, dass mit _Auszeichnung_ Wörter betont werden (u.a. auch in der Markdown-Syntax).
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Nachdem ich noisefloors ersten Beitrag gelesen habe, schwant mir woher das mit den unterstrichen kommt...
Jetzt wo du's sagst... ist wohl eine _klassischer_ Kollateralschaden... ;-) Aber Sirius3 versteht mich immerhin :-)

Also: beim Programmieren mit Python bitte keinen einfach führenden Underscore in Kombination mit einfach angehängte Underscore verwenden. Macht man nicht.

Gruß, noisefloor
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Letzteres würde ich ja noch gelten lassen, wenn die Forensoftware dies dann kursiv oder unterstrichen etc. wiedergeben bzw. darstellen (_gerendert_ ?) würde...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist uebliche Konvention. Auch *fuer* fett-druck. Und /italic/ geht auch...
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

so was wie "...du muss *vorher* die Zuwesiung machen..." hat BlackJack ja gerne benutzt. Da kann bei Python auch nichts schiefgehen, weil *vorher* kein gültiger Bezeichner für eine Variable ist ;-)

Gruß, noisefloor
Antworten