Seite 1 von 1

Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 10:43
von Mr. R341
Folgendes Problem:

Ich rufe eine Funktion auf, erstelle eine Variable und möchte diese zurückgeben zum weiterverarbeiten.
Was ich bekomme ist allerdings ein NameError "data", verstehe aber nicht wieso...

Vielen Dank für eure Hilfe :)

Code: Alles auswählen

import urllib.request, json
import urllib.request, xml

def main():
    data_request()
    actual_temp = "Die derzeitige Temperatur beträgt: {}°C".format(data["main"]["temp"])

def data_request():
    with urllib.request.urlopen("Some Url with json") as url:
        data = json.loads(url.read())
        return data

if __name__ == "__main__":
    main()

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 10:48
von Bolitho
Du musst die Daten an eine Variable binden, wenn du die Funktion aufrufst, um das zurückgegebene Datenpaket anzunehmen.

ungetestet:

Code: Alles auswählen

import urllib.request, json
import urllib.request, xml

def main():
    data = data_request()
    actual_temp = "Die derzeitige Temperatur beträgt: {}°C".format(data["main"]["temp"])

def data_request():
    with urllib.request.urlopen("Some Url with json") as url:
        data = json.loads(url.read())
        return data

if __name__ == "__main__":
    main()
Hier wäre ein passender Artikel zum Thema Namensraum: https://realpython.com/python-scope-leg ... ding-scope

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 10:49
von Mr. R341
ups.. ich hab einen fehler im Beitrag dashier is der eigentliche Codeschnipsel:

data_request() hat noch ein argument drin gehabt, was da nicht rein gehörte :P

Code: Alles auswählen

import urllib.request, json
import urllib.request, xml

def main():
    data_request()
    actual_temp = "Die derzeitige Temperatur beträgt: {}°C".format(data["main"]["temp"])

def data_request():
    with urllib.request.urlopen("Some Url with json") as url:
        data = json.loads(url.read())
        return data

if __name__ == "__main__":
    main()

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 10:52
von sparrow
Und der komplette Traceback mit Fehlermeldung?

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 10:53
von Mr. R341
Bolitho hat geschrieben: Donnerstag 3. Dezember 2020, 10:48 Du musst die Daten an eine Variable binden, wenn du die Funktion aufrufst, um das zurückgegebene Datenpaket anzunehmen.

ungetestet:

Code: Alles auswählen

import urllib.request, json
import urllib.request, xml

def main():
    data = data_request()
    actual_temp = "Die derzeitige Temperatur beträgt: {}°C".format(data["main"]["temp"])

def data_request(data):
    with urllib.request.urlopen("Some Url with json") as url:
        data = json.loads(url.read())
        return data

if __name__ == "__main__":
    main()
ui super :D Das Funktioniert einwandfrei ^^ Danke :)

Ich frage mich, was Sirius3 oder __Blackjack__ dazu sagen, dass in main(): "data = funktion" und nicht nur eine funktion steht ^^

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 11:15
von Sirius3
main ist auch nur eine Funktion wie jede andere auch. Und wenn man sich auf Funktionen ohne Rückgabe beschränken müßte, könnte man keine komplexen Sachen programmieren.
Deine Importe sehen komisch aus, urllib.requests wird zwei mal importiert; jedes Modul sollte seine eigene import-Zeile bekommen.
`actual_temp` wird gar nicht verwendet. Benutze auch keine Abkürzungen. Aus dem Text vermute ich, dass die Variable eigentlich current_temperature heißen müßte.

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 11:30
von Mr. R341
Sirius3 hat geschrieben: Donnerstag 3. Dezember 2020, 11:15 main ist auch nur eine Funktion wie jede andere auch. Und wenn man sich auf Funktionen ohne Rückgabe beschränken müßte, könnte man keine komplexen Sachen programmieren.
Deine Importe sehen komisch aus, urllib.requests wird zwei mal importiert; jedes Modul sollte seine eigene import-Zeile bekommen.
`actual_temp` wird gar nicht verwendet. Benutze auch keine Abkürzungen. Aus dem Text vermute ich, dass die Variable eigentlich current_temperature heißen müßte.
Ja.. hatte dahinter noch ein print() zum debuggen, desswegen war actual_temp ungenutzt
(Danke xD denkfehler bei der Übersetzung)

ups.. danke ^^ beim xml gehört eig. ein # davor :P

warum keine Abkürzungen?

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 11:44
von __deets__
Warum Abkürzungen? Code wird um Größenordnungen öfter Gelesen als geschrieben. Das unnötig schwer zu gestalten spart an der falschen Stelle.

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 11:45
von Sirius3
Keine Abkürzungen, weil Du jedes mal beim Tippen und beim Lesen Hirnkapazität brauchst, um die Abkürzung wieder zu entschlüsseln. Und natürlich denkt jeder zweite bei temp an temporär, was in dem Zusammenhang total verwirrt. Kurz: Festplattenkapazität ist billiger als Hirnkapazität.

Re: Eine Variable in einer Funktion zurückgeben (NameError)

Verfasst: Donnerstag 3. Dezember 2020, 12:42
von pillmuncher
Warum keine Abkürzungen? Glücklicherweise sind die Bit-Preise in letzter Zeit stark gefallen. Ein Bit kostet inzwischen deutlich weniger als €100,--.