Frage

Diese Frage bereits eine Antwort hier:

Aus diesen nicht Keine Tests.

if val != None:

if not (val is None):

if val is not None:

Welches vorzuziehen ist, und warum?

War es hilfreich?

Lösung

if val is not None:
    # ...

ist das Pythonic Idiom für die Prüfung, dass eine Variable nicht auf None gesetzt. Dieses Idiom hat besondere Anwendungen im Fall von erklärt Stichwort Funktionen mit Standardparametern . is testet Identität in Python. Da es eine und nur eine Instanz von None in einem laufenden Python-Skript / Programm, is ist der optimale Test dafür. Wie Johnsyweb Punkte aus wird dies diskutiert in PEP 8 unter "Programmieren Empfehlungen".

Was, warum ist diese bevorzugt zu

if not (val is None):
    # ...

Dies ist nur ein Teil des Zen of Python : „Ablesbarkeit zählt .“ Guter Python ist oft in der Nähe guten Pseudo-Code .

Andere Tipps

Aus, Programmierung Empfehlungen, PEP 8 :

Vergleiche zu Singletons wie Keiner sollte immer mit getan werden ‚Ist‘ oder ‚nicht‘, nie die Gleichheitsoperator.

Auch passen sie zu schreiben „wenn x“, wenn Sie wirklich bedeuten „wenn x nicht None ist“ -- z.B. wenn bei der Prüfung, ob eine Variable oder ein Argument, dass standardmäßig Keiner wurde auf einen anderen Wert eingestellt. Der andere Wert könnte eine Art haben (Wie ein Container), die in einem Booleschen Kontext falsch sein könnte!

PEP 8 ist eine wichtige Lektüre für jeden Python-Programmierer.

Jeder der beiden letzteren, da val möglicherweise von einem Typ sein könnte, das definiert __eq__() true zurück, wenn None übergeben.

Die beste Wette mit dieser Art von Fragen ist, genau zu sehen, was Python tut. Das dis Modul ist unglaublich informativ:

>>> def f(val):
...   if val != None:
...     return True
...   return False
...
>>> def g(val):
...   if not (val is None):
...     return True
...   return False
...
>>> def h(val):
...   if val is not None:
...     return True
...   return False
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               3 (!=)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(h)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE

Beachten Sie, dass die letzten beiden Fällen die gleiche Folge von Operationen verringern (Python liest not (val is None) und verwendet den is not Operator). Die ersten Anwendungen der != Operator, wenn sie mit Keinem verglichen wird.

Wie bereits von anderen Antworten aus, != zu verwenden, wenn mit keinem Vergleich eine schlechte Idee ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top