Python: Ist es in Ordnung, boolean und string zurückzugeben?

7

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%     
shodanex 18.03.2009, 11:26
quelle

8 Antworten

6

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.

    
Tim Ottinger 18.03.2009, 17:32
quelle
26

Wäre es nicht geeigneter, ein None anstelle von False zurückzugeben?

    
jelovirt 18.03.2009 11:28
quelle
10

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.

    
Steven Huwig 18.03.2009 12:53
quelle
5

Sie könnten die Zeichenfolge zurückgeben, wenn sie rechtzeitig angekommen ist, oder eine geeignete Ausnahme auslösen, die eine Zeitüberschreitung anzeigt.

    
Ber 18.03.2009 12:47
quelle
5

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.

    
utku_karatas 18.03.2009 11:28
quelle
3

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.

    
Manuel Ferreria 18.03.2009 11:28
quelle
2

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.

    
Jason Baker 18.03.2009 17:58
quelle
1

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:

%Vor%

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 .

    
Daniel Naab 22.03.2009 17:06
quelle

Tags und Links