Ist es eine schlechte Praxis, das folgende Format zu verwenden, wenn my_var
None sein kann?
if my_var and 'something' in my_var:
#do something
Das Problem ist, dass 'something' in my_var
ein TypeError ausgelöst wird, wenn my_var None ist.
Oder sollte ich verwenden:
if my_var:
if 'something' in my_var:
#do something
oder
try:
if 'something' in my_var:
#do something
except TypeError:
pass
Um die Frage neu zu formulieren: Welche der oben genannten Methoden ist die beste Vorgehensweise in Python (falls vorhanden)?
Alternativen sind willkommen!
python
if-statement
tgray
quelle
quelle
andalso
oderorelse
Ja, es ist sicher, es ist explizit und sehr klar in der Sprachreferenz definiert:
quelle
Ich mag hier ein wenig pedantisch sein, aber ich würde sagen, die beste Antwort ist
if my_var is not None and 'something' in my_var: #do something
Der Unterschied ist die explizite Prüfung auf
None
, anstatt die implizite Konvertierung vonmy_var
zuTrue
oderFalse
.Während ich in Ihrem Fall sicher bin, dass die Unterscheidung nicht wichtig ist, wäre es im allgemeineren Fall durchaus möglich, dass die Variable nicht,
None
sondern dennoch ausgewertet wirdFalse
, beispielsweise ein ganzzahliger Wert von0
oder eine leere Liste.Entgegen den meisten Behauptungen der anderen Poster, dass es sicher ist, würde ich sagen, dass es sicher ist, solange Sie explizit sind. Wenn Sie nicht überzeugt sind, dann betrachten Sie diese sehr erfundene Klasse:
class Contrived(object): def __contains__(self, s): return True def __nonzero__(self): return False my_var = Contrived() if 'something' in my_var: print "Yes the condition is true" if my_var and 'something' in my_var: print "But this statement won't get reached." if my_var is not None and 'something' in my_var: print "Whereas this one will."
Ja, ich weiß, dass dies kein realistisches Beispiel ist, aber es kommt zu Abweichungen im realen Code, insbesondere wenn
None
ein Standardfunktionsargument angegeben wird.quelle
in
Operation sicherlich bedeutungslos. Ich denke, OP hat es genau richtig. Während es möglich ist, irgendetwas zu konstruieren, um seinen Standpunkt zu beweisen, glaube ich nicht, dass sich ein anständiger Code in den Fuß schießen sollte.if var
"wenn du wirklich meinst" zu sagenif var is not None
. Sobald Sie sich an diese Gewohnheit gewöhnt haben, kann sie Sie leicht beißen, insbesondere bei Standardargumenten.if var
und das hat er getan.Es ist nicht so einfach. Als C # -Kerl bin ich es sehr gewohnt, so etwas zu tun wie:
if(x != null && ! string.isnullorempty(x.Name)) { //do something }
Das obige funktioniert gut und wird wie erwartet bewertet. In VB.Net würde jedoch Folgendes zu einem Ergebnis führen, das Sie NICHT erwartet haben:
If Not x Is Nothing **And** Not String.IsNullOrEmpty(x.Name) Then 'do something End If
Das Obige wird eine Ausnahme erzeugen. Die richtige Syntax sollte sein
If Not x Is Nothing **AndAlso** Not String.IsNullOrEmpty(x.Name) Then 'do something End If
Beachten Sie den sehr subtilen Unterschied. Dies hat mich ungefähr 10 Minuten lang verwirrt (viel zu lang) und deshalb müssen C # (und andere) Typen beim Codieren in anderen Sprachen sehr vorsichtig sein.
quelle
Ich würde mit dem Versuch / außer gehen, aber es hängt davon ab, was Sie über die Variable wissen.
Wenn Sie erwarten, dass die Variable die meiste Zeit vorhanden ist, ist ein Versuch / eine Ausnahme weniger Operationen. Wenn Sie erwarten, dass die Variable die meiste Zeit Keine ist, enthält eine IF-Anweisung weniger Operationen.
quelle
Es ist absolut sicher und ich mache es die ganze Zeit.
quelle