Seite 1 von 1

Frage zu 'if ret: print rrdtool.error()'

Verfasst: Dienstag 8. Oktober 2019, 12:51
von nemo2019
Ich beginne mit Python und habe derzeit ein Projekt angefangen, bei dem Daten einer Wetterstation ausgelesen werden und in eine rrd-Datenbank geschrieben werden. Beim Schreiben des Codes und beim Durchsehen verschiedener Codebeispiele im Internet stoße ich immer wieder auf solche Codeabschnitte (nur Ausschnitt wiedergegeben):

Code: Alles auswählen

data = "N:h:t"
ret = rrdtool.update("%s/humidity.rrd" % 
(os.path.dirname(os.path.abspath(__file__))),data)

if ret:
    print rrdtool.error()
    time.sleep(300)
Was ich nicht verstehe, ist konkret dieser Abschnitt:

Code: Alles auswählen

if ret:
    print rrdtool.error()
Was soll dieser Abschnitt bewirken.? Ist es, einen Fehler auszugeben, wenn das Programm Probleme hat? Was ist aber, wenn kein Fehler auftritt? Wird dann nichts ausgegeben? Könnte man das auch mit 'try' und 'exception' genauso lösen.
Die Frage klingt vielleicht trivial, ich möchte aber den Code nicht mit copy und paste erstellen, sondern ihn verstehen. Von alleine kann ich doiese Frage nicht beantworten. Ich habe diese Frage schon in einem renommierten Forum vorgelegt. Antwort 'too broad' mit Ablehnung der Veröffentlichung im Forum. Vielleicht sind die Leute hier im Forum nicht ganz so streng mit einem 'newbie'.

Re: Frage zu 'if ret: print rrdtool.error()'

Verfasst: Dienstag 8. Oktober 2019, 13:21
von __deets__
Um zu verstehen, was da passiert, musst du dir anschauen was rddtool.update zurueckgibt. Und daraufhin in Gedanken durchspielen, was das fuer die Ausfuehrung des folgenden Codes bedeutet.

Und nein. Man kann nicht einfach eine Rueckgabewert-basierende Fehlerbehandlung (wie man sie eigentlich aus Sprachen kennt, die keine Exceptions haben, wie zB C) automagisch in try/except ueberfuehren.

Re: Frage zu 'if ret: print rrdtool.error()'

Verfasst: Dienstag 8. Oktober 2019, 13:59
von Sirius3
@nemo2019: warum benutzt Du os.path.dirname stückelst aber dann den Pfad per %-Formatierung zusammen, statt os.path.join zu benutzen???

Sollten solche Abfragen öfter vorkommen, könnte man die Fehlerbehandlung per Dekorator halbmagisch in Exceptions umwandeln.

Re: Frage zu 'if ret: print rrdtool.error()'

Verfasst: Dienstag 8. Oktober 2019, 14:49
von __blackjack__
@nemo2019: Wenn Du mit Python beginnst, solltest Du wirklich nicht mehr mit Python 2 beginnen. In Python 3 könnte das dann so aussehen:

Code: Alles auswählen

    data = "N:h:t"
    return_code = rrdtool.update(
        Path(__file__).absolute().with_name("humidity.rrd"), data
    )

    if return_code != 0:
        print(rrdtool.error())
        time.sleep(300)
Wobei: Es scheint hier bei mir gar keine `error()`-Funktion im `rrdtool`-Modul zu geben. Also nicht einfach blind irgendwo abschreiben, sondern auch tatsächlich alles mal ausprobieren — inklusive der Fehlerbehandlung.

Re: Frage zu 'if ret: print rrdtool.error()'

Verfasst: Dienstag 8. Oktober 2019, 15:29
von nemo2019
Vielen Dank für di9e vielen Tipps.
Ein Hinweis war sehr wertvoll, dass es sich nämlich um Python2-Code handelt. Die Zeile mit ' if return_code != 0:' erscheint mir viel logischer. Auch der Hinweis mit der %-Formatierung ist wichtig. Findet man noch oft im Text.
Eure Hinweise waren wirklich gut, besser als die arrogante Attitude in stackoverflow, die ich erfahren musste Vielen Dank!!