Seite 1 von 1

name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 07:06
von Kirikkayis
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?

Re: name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 07:30
von Bolitho

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.

Re: name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 07:57
von OozeWithUzi
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)

Re: name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 08:42
von Sirius3
@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.

Re: name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 12:02
von Kirikkayis
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.

Re: name 'obj' is not defined json

Verfasst: Mittwoch 10. Juli 2019, 13:21
von Sirius3
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.