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

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
nemo2019
User
Beiträge: 2
Registriert: Dienstag 8. Oktober 2019, 12:34

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

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

@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.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
nemo2019
User
Beiträge: 2
Registriert: Dienstag 8. Oktober 2019, 12:34

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!!
Antworten