Eine Variable in einer Funktion zurückgeben (NameError)

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
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Donnerstag 3. Dezember 2020, 10:43

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()
Zuletzt geändert von Mr. R341 am Donnerstag 3. Dezember 2020, 10:50, insgesamt 1-mal geändert.
Bolitho
User
Beiträge: 217
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

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():
    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
Zuletzt geändert von Bolitho am Donnerstag 3. Dezember 2020, 10:52, insgesamt 2-mal geändert.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Donnerstag 3. Dezember 2020, 10:49

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()
Benutzeravatar
sparrow
User
Beiträge: 2745
Registriert: Freitag 17. April 2009, 10:28

Donnerstag 3. Dezember 2020, 10:52

Und der komplette Traceback mit Fehlermeldung?
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Donnerstag 3. Dezember 2020, 10:53

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 ^^
Sirius3
User
Beiträge: 14798
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Donnerstag 3. Dezember 2020, 11:30

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?
__deets__
User
Beiträge: 10072
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 3. Dezember 2020, 11:44

Warum Abkürzungen? Code wird um Größenordnungen öfter Gelesen als geschrieben. Das unnötig schwer zu gestalten spart an der falschen Stelle.
Sirius3
User
Beiträge: 14798
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 3. Dezember 2020, 11:45

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1268
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Donnerstag 3. Dezember 2020, 12:42

Warum keine Abkürzungen? Glücklicherweise sind die Bit-Preise in letzter Zeit stark gefallen. Ein Bit kostet inzwischen deutlich weniger als €100,--.
In specifications, Murphy's Law supersedes Ohm's.
Antworten