2016-07-14 9 views
0

Ich schreibe einen Leser von DS18B20 sensors mit subprocess.Popen und Parsing die Ausgabe einer Gerätedatei über cat Befehl. Da das Ergebnis unvorhersehbar sein kann (ein 1-Draht-Softwaretreiber ist auf Raspberry Pi nicht besonders zuverlässig), möchte ich die Funktion etwas kugelsicherer machen und alle möglichen Fälle der Konsolenausgabe erfassen. Wesentlichen die Frage an die kommt, wenn Kette gegen Ausnahme Frage. Ich fühle mich wie Ausnahmen zu vermeiden, ist eine gute Sache, so kam ich mit so etwas nach oben:Wenn Kette vs Ausnahme in Python

def check_crc(lines): 
    out = False 
    if type(lines) == list: 
     if len(lines) >= 1: 
      if type(lines[0]) == str and type(lines[1]) == str: 
       out = lines[0].strip()[-3:] == 'YES' and lines[1].find('t=') != -1 
    return out 

Gibt es eine sauberere Möglichkeit zu tun, dass Ausnahmen verwenden? Sollte ich hier Ausnahmen verwenden?

+0

Das hängt davon ab, was die Ausgabe, die Sie parsen sehen aus wie bei der Arbeit und unter Fehlerbedingungen: Abfangen IndexError, TypeError und AttributeError sollte dafür ausreichen. Ihre Überprüfungen scheinen jedoch sehr redundant zu sein. Wenn Sie etwas aus einem Prozess gelesen haben, müssen Sie nicht überprüfen, ob es sich um eine Liste von Zeichenfolgen handelt. – pvg

+0

Das sieht wirklich wie eine Frage aus, die für [Code Review] (http://codereview.stackexchange.com/) besser geeignet wäre als Stack Overflow. Da an Ihrem Code eigentlich nichts falsch ist und Sie nach Meinungen darüber suchen, wie Sie diese verbessern können, wäre Code Review der richtige Ort für Sie. Sie müssen die Frage aus dem Stapelüberlauf löschen und anschließend in die Code Review-Funktion stellen. Stellen Sie sicher, es nicht an beiden Orten zu haben, da Cross-Posting dringend empfohlen wird (z. B. schlecht für Sie). –

+1

Eine gemeinsame Programmierung Idiom in Python verwendet wird, ist EAFP (https://docs.python.org/2/glossary.html), wo man richtige Antworten übernehmen und Ausnahmen zu behandeln. Ich versuche, verschachtelte 'if' Ketten zu vermeiden. – AChampion

Antwort

1

Ich würde auf jeden Fall Ihre erste if-Anweisung ziehen. Wenn Sie möchten, dass Ihre Funktion nur eine Liste akzeptiert, übergeben Sie nur eine Liste. Für zukünftige Referenz ist isinstance zu type(o) == cls vorzuziehen. Die zweite if-Anweisung sollte if lines sein.

Ihre dritte if-Anweisung könnte zu etwas wie all(isinstance(line, str) for line in lines[:2]) vereinfacht werden. Wiederum ist es jedoch vorzuziehen, nur die Funktion mit dem korrekten Argumenttyp aufzurufen.

Persönlich würde ich etwas viel einfacheres bevorzugen.

def check_crc(lines): 
    return lines[0].endswith("YES") and "t=" in lines[1] 
+0

Danke, dass du mir in dieser Antwort so viele Tricks beigebracht hast! – nagimov