name 'obj' is not defined json

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
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Hey,

ich hab eine main Funktion (if ___main___ == "__main__": ) die wiederum eine andere Funktion in einem von mir geschriebenem Modul aufruft.

Code: Alles auswählen

if __name__ == "__main__":
	jsonExport = XYZ.load_json_file()
Modul:

Code: Alles auswählen

def load_json_file():
	with open('D:\\export.json', 'r') as f:
		f_contents = f.read()
		try:
			obje = json.loads(f_contents)
		except ValueError:
			print("error")
		return obje
Führe ich nun mein Skript aus erhalte ich die Fehlermeldung: "name 'obje' is not defined.
Ich habe die export.json Datei überprüft, diese ist weder leer noch fehlerhaft.
Jemand eine Idee wie ich es zum laufen bekomme?
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Code: Alles auswählen

def load_json_file():
	with open('D:\\export.json', 'r') as f:
		f_contents = f.read()
		try:
			obje = json.loads(f_contents)
			return obje
		except ValueError:
			print("error")
Die Variable obje kann nur zurückgegeben werden, wenn sie auch definiert wird.
Was genau schief läuft kann ich so nicht sagen, dazu bräuchte ich die komplette Ausgabe nach Aufruf des Programms.
OozeWithUzi
User
Beiträge: 9
Registriert: Montag 8. Juli 2019, 13:40

Nach meinem bisherigen ReadOnly Zugriff auf das Forum, möchte ich mich auch Mal zu Wort melden:

Bolitho gibt dir ja schon eine sehr wahrscheinliche Lösung vor. Evtl. solltest du dich mit Variablen und Scope zu beschäftigen. Damit wird dann auch klar, WARUM der Fehler an der Stelle kommt.

Weiter wirft json.loads eine JSONDecodeError Exception, wenn ich mich nicht irre und die Einrückungen kommen mir sehr weit vor (Tab <-> 4 Blanks)
Sirius3
User
Beiträge: 18259
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kirikkayis: Du hast keine main-Funktion, sondern nur eine if-Abfrage. Besser wäre es, tatsächlich eine main-Funktion zu schreiben:

Code: Alles auswählen

def main():
    json_export = xyz.load_json_file()

if __name__ == '__main__':
    main()
Nach Konvention werden Variablennamen, Funktionen und Module klein_mit_unterstrich geschrieben und mit 4 Leerzeichen pro Ebene eingerückt, keine Tabs. Variablennamen sollte man nicht abkürzen, vor allem nicht, wenn dann so ein verstümmelter Buchstabensalat wie `obje` herauskommt. Beim Programmieren muß das doch mühsam sein, immer wieder die selben Schreibfehler zu reproduzieren.

Der Fehler tritt eindeutig bei loads auf, um zu wissen, was falsch ist, müßte man aber den Inhalt von `f_contents` kennen, bzw. die unsinnige "Fehlerbehandlung" komplett entfernen, weil dann wird Dir auch genau gesagt, was daran falsch ist.
Fehler sollte man nur behandeln, wenn sie an dieser Stelle auch sinnvoll behandelbar ist. Eine Behandlung, die gleich danach in einem NameError endet, ist es sicher nicht. Warum verwendest Du `json.loads` statt `json.load`?

Literale Stringwerte sollte man als Konstanten am Anfang definieren, damit jeder gleich sieht, welche Abhängigkeiten es gibt und um Schreibfehler zu verhindern, falls der selbe Wert öfter auftritt. json-Daten erwarten ein bestimmtes Encoding, das sollte man entweder direkt beim Öffnen der Datei angeben, oder die Datei binär öffnen, dann sorgt `json.load` gleich für die richtige Zeichenbehandlung.

Übrig bleibt also:

Code: Alles auswählen

EXPORT_FILENAME = 'D:\\export.json'

def load_json_file():
    with open(EXPORT_FILENAME, 'rb') as f:
        return json.load(f)
@OozeWithUzi: JSONDecodeError ist eine abgeleitete Klasse von ValueError, damit wird sie auch durch diesen except-Block abgefangen.
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Danke @all für eure Antworten, diese habe ich zur Kenntnis genommen.
Mit dem Vorschlag von Bolitho hat das ganze einwandfrei funktioniert, nun beschäftige ich mich mit euren Gedankenstößen.
Sirius3
User
Beiträge: 18259
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Lösung von Bolitho gibt implizit `None` zurück, falls die Datei kaputt ist. Falls es wirklich das ist, was Du tun möchtest, solltest Du das explizit machen. Falls Du aber `None` nur als Platzhalter benutzt, "da ist ein Fehler passiert", dann solltest Du die Exception gar nicht in der Funktion load_json_file abfangen, sondern an der Stelle, wo Du eine sinnvolle Fehlerbehandlung machen kannst.
Antworten