Ursprüngliche Frage
Ich habe eine Funktion erstellt, die darauf wartet, dass eine bestimmte Zeichenfolge an einer seriellen Schnittstelle angezeigt wird, und gibt alle gelesenen Zeichen zurück, bis die Zeichenfolge gefunden wurde. Andernfalls wird false zurückgegeben. Das ist sehr praktisch, aber ich habe mich gefragt, ob es als schlechte Praxis angesehen wird oder nicht?
Klarstellung:
Das primäre Ziel besteht darin, auf eine bestimmte Zeichenfolge zu warten, die in einer bestimmten Zeit angezeigt wird. Abgesehen von einem IO-Fehler ist das mögliche Ergebnis True (die Zeichenfolge ist aufgetreten) oder False Das sekundäre Ziel ist es, die gesamte Ausgabe zu erhalten, weil es möglicherweise Informationen gibt, die ich analysieren möchte, bevor die eigentliche Antwort gesucht wird. Ich dachte, ich könnte das primäre und sekundäre Ziel in einem Rückgabewert kombinieren.
%Vor%Bearbeiten: Eine andere vorgeschlagene Antwort ist, eine Ausnahme auszulösen. Ich denke nicht, dass es eine gute Idee ist, weil das Timeout ein erwartetes Verhalten ist. Ich meine, wenn es einen Parameter für die Angabe eines Timeouts gibt, dann ist ein Timeout ein mögliches Ergebnis und keine Ausnahme.
Bearbeiten 2: Da ich die Eingabe speichern muss, ist vielleicht die Verwendung einer Klasse die richtige Lösung. Die Wait-for-Funktion hat einen eindeutigen Rückgabewert, aber die gesamte Zeichenfolge, die bis zum Timeout gelesen wurde, ist ebenfalls zugänglich.
%Vor%Es wäre besser, einen String UND einen Booleschen Wert (wie im Titel) zurückzugeben, anstatt eine Zeichenkette oder einen booleschen Wert zurückzugeben. Sie sollten nicht herausfinden müssen, was der Rückgabewert bedeutet. Es sollte vollständig explizit sein und orthogonale Probleme sollten in verschiedene Variablen unterteilt werden.
%Vor%Ich gebe Tupel nicht oft zurück, weil es sich lustig anfühlt. Aber es ist vollkommen richtig, dies zu tun.
Die Rückgabe von "None" ist eine gültige Lösung, die hier bereits erwähnt wurde.
Ich glaube, das orthodoxe Python-Design wäre, None zurückzugeben. Das Handbuch lautet:
Keine
Dieser Typ hat einen einzelnen Wert. Es gibt ein einzelnes Objekt mit diesem Wert. Dies Objekt wird über die aufgerufen Eingebauter Name Keine. Es ist gewohnt zu bedeute die Abwesenheit eines Wertes in vielen Situationen, z. B. von denen zurückgegeben wird Funktionen, die nicht explizit zurückgegeben werden etwas. Sein Wahrheitswert ist falsch.
Die praktische Sache ist, in diesem Fall eine leere Zeichenfolge zurückzugeben.
Außerdem wird eine leere Zeichenfolge in Python trotzdem als False ausgewertet. Man könnte es also so nennen:
%Vor%Zusatz: Wie von S. Lott hervorgehoben, ist der wahre pythonische Weg, keine zurückzugeben. Obwohl ich Strings in String-verwandten Funcs zurückgeben möchte. Eine Frage der Präferenz in der Tat.
Ich nehme auch an, dass der Aufrufer von Myfunc nur daran interessiert ist, eine Zeichenfolge zum Bearbeiten zu erhalten - leer oder nicht. Wenn der Aufrufer nach Timeout-Problemen usw. suchen muss, ist es besser, Ausnahmen zu verwenden oder None zurückzugeben.
Vielleicht wäre es besser, wenn Sie ein Tupel wie (False, None) und (True, test) zurückgeben, da Sie sie getrennt bewerten können und keine unnötige Komplexität hinzufügen.
EDIT: Vielleicht ist der String, der auf dem seriellen Port erschien, "" (vielleicht erwartet), also kann die Rückgabe von True sagen, dass er auf diese Weise angekommen ist.
Um Bers Punkt hinzuzufügen, möchten Sie vielleicht etwas anderes berücksichtigen. Wenn Sie eine leere Zeichenfolge oder None verwenden, lassen Sie die Tür offen für Fehler der "dummen" Variante. Auf der anderen Seite, wenn Sie eine Ausnahme auslösen, erzwingen Sie die Ausführung der Operation, die ausgeführt wird, um abgebrochen zu werden.
Betrachten Sie zum Beispiel den folgenden Code:
%Vor%Dies wird eine Ausnahme auslösen, wenn die Operation abgelaufen ist und entweder eine leere Zeichenfolge oder None hat. Also müssten Sie das ändern zu:
%Vor%Diese Art von Änderungen neigen dazu, sich zu addieren und Ihren Code schwieriger zu verstehen.
Natürlich bin ich mir sicher, dass Ihre Antwort darauf etwas sein wird wie "Ich werde das nicht tun" oder "Das wird nicht passieren", worauf meine Antwort lautet: "Selbst wenn Sie es nicht tun rennen Sie mit dieser Funktion hinein, und Sie werden es irgendwann tun. " Diese Arten von Fehlern sind fast immer das Ergebnis von Fällen, an denen Sie normalerweise nicht denken.
Dies ist ein klassischer Anwendungsfall für Python-Generatoren. Das Schlüsselwort yield
bietet eine einfache Möglichkeit, über einzelne Mengen zu iterieren, ohne das gesamte Objekt auf einmal zurückzugeben:
Der Schlüssel hier ist, dass es keinen Rückgabewert gibt, um das Ende der Eingabe anzugeben; Stattdessen erreichen Sie einfach das Ende des Iterators. Weitere Informationen zu Generatoren hier .
Tags und Links python