Fehler class 'TypeError'

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
siver
User
Beiträge: 8
Registriert: Dienstag 16. Juli 2019, 09:33

Hallo zusammen,

ich bin noch relativ neu in Python unterwegs und generell kein richtiger Programmierer. Ich versuche mich nur hier und da mal mit einigem aus. Aktuell versuche ich eine Wetter-API auszulesen. Ich bastle noch an dem Skript und hatte bis gestern noch Erfolg und hab nur noch an der Ausgabe gebastelt. Aber nun erhalte ich nur noch Fehlermeldungen: "<class 'TypeError'>"

Hier der Code:

Code: Alles auswählen

from requests import get
import datetime

def get_api(link, text):
    try:
        url = get(link)
        print("%s API %s wurde geholt\n" % datetime.datetime.now(), text)
        log_write("%s API %s wurde geholt\n" % datetime.datetime.now(), text)
        return (url.json())
    except:
        e = sys.exc_info()[0]
        print('API %s konnte nicht geholt werden' % e)
        log_write("%s API konnte nicht geholt werden\n" % datetime.datetime.now())
        return(False)

Der Code ist noch nicht ganz sauber, da ich aufgrund der Fehlersuche noch dran rum bastle. Ich hab noch eine Funktion namens log_write() gebaut, da ich alles loggen will, was so passiert.

Ich hoffe, mir kann jemand helfen.

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

Eine Angewohnheit die du wirklich sofort loswerden musst: nackte excepts. Denn damit faengst du ALLES ab. Auch Programmierfehler die sonst gemeldet und zur Loesung des Problems beitragen wuerden. Darum bitte das try/except loswerden. Und in deinem Fall wuerde das sogar das Programm verbessern: ein JSON-Objekt oder False zurueck zu geben ist eine wirklich ganz schlechte API, weil damit die Buerde, festzustellen was passiert ist, auf der Aufrufer-Seite liegt. Wenn die Exception fliegt, ist es viel klarer an der aufrufenden Stelle, das was schief gegangen ist, und es wird nicht versehentlich mit einem Wert weiter gearbeitet, der dann erst viel spaeter (oder schlimmer: nie) zum Fehler fuehrt.

Last but not least: return ist keine Funktion. Die Klammern sind also ueberfluessig, und stoeren den Lesefluss. Und ja, das macht einen Unterschied, schliesslich sollen wir deinen Code ja lesen, um ihn zu verstehen und dir zu helfen.

Wenn du die Anregungen umgetzt hast, solltest du einen kompletten Traceback bekommen, und den kannst du dann nochmal posten, dann kann man hoffentlich mehr sagen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo, kannst du bitte den kompletten Code und die komplette Fehlermeldung posten?

#edit: war wohl wieder zu langsam --> erstmal Kaffee holen.
Zuletzt geändert von Jankie am Dienstag 16. Juli 2019, 10:12, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo siver,

zum Loggen gibt es das logging-Modul. Statt also etwas selbst zu programmieren, solltest Du das benutzen.
`get` ist so ein allgemeiner Name, dass man normalerweise das requests-Modul importiert und requests.get aufruft, damit man gleich am Code ablesen kann, was passiert.
Fehlerbehandlung sollte dort stattfinden, wo es sinnvoll möglich ist. `False` ist entweder ein valider Rückgabewert, oder ein magischer Wert, der einen Fehler anzeigt. Beides ist für eine Fehlerbehandlung nicht gut. Einfach die Exception unbehandelt weiterreichen lassen.
`url` ist der falsche Name für eine Antwort einer HTTP-Anfrage. `response` ist der übliche Name.
`return` ist keine Funktion, sollte also nicht wie eine solche geschrieben werden. Die Klammern gehören weg.

Bleibt also:

Code: Alles auswählen

import logging
import requests
logger = logging.getLogger(__name__)

def get_api_answer(link, text):
    response = requests.get(link)
    logger.info("API %s wurde geholt", text)
    return response.json()
Wenn Du Deine unsinnige Fehlerbehandlung gelöscht hast, solltest Du genau erfahren, was tatsächlich falsch läuft. Bitte dann den kompletten Traceback und den Aufruf der Funktion mit seinen Parametern zeigen.
siver
User
Beiträge: 8
Registriert: Dienstag 16. Juli 2019, 09:33

Vielen Dank für die schnellen Antworten. Es lag an den Exceptions, dass ich nicht weiter kam. mein Code funktioniert nun wieder.

@Jankie: Mit dem Code baue ich eine html-Seite. Der sieht wahrscheinlich eher beholfen als stilvoll aus. Wenn du den Code dennoch haben willst kann ich ihn dir gern zuschicken ;)
Antworten