niet Geen test in Python

Van deze niet Geen-tests.

if val != None:
if not (val is None):
if val is not None:

Welke heeft de voorkeur en waarom?


Antwoord 1, autoriteit 100%

if val is not None:
    # ...

is het Pythonische idioom om te testen of een variabele niet is ingesteld op None. Dit idioom wordt vooral gebruikt in het geval van het declareren van trefwoordfuncties met standaardparameters. istest identiteit in Python. Omdat er één en slechts één exemplaar van Noneaanwezig is in een draaiend Python-script/programma, is ishiervoor de optimale test. Zoals Johnsyweb aangeeft, wordt dit besproken in PEP 8onder “Programmeeraanbevelingen”.

Waarom dit de voorkeur heeft boven

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

dit is gewoon een onderdeel van de Zen van Python: “Leesbaarheid telt .” Goede Python komt vaak in de buurt van goede pseudocode.


Antwoord 2, autoriteit 11%

Van, Programmeeraanbevelingen, PEP 8:

Vergelijkingen met singletons zoals None moeten altijd worden gedaan met isof is not, nooit de gelijkheidsoperatoren.

Pas ook op voor het schrijven van if xwanneer u echt bedoelt if x is not None– b.v. Bij het testen of een variabele of argument waarvan geen enkele waarde is ingesteld op een andere waarde. De andere waarde kan een type (zoals een container) hebben die onjuist zou kunnen zijn in een Booleaanse context!

PEP 8 is essentieellezing voor elke Python-programmeur.


Antwoord 3, Autoriteit 3%

De beste gok met dit soort vragen is om precies te zien wat Python doet. dismodule is ongelooflijk informatief:

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

Merk op dat de laatste twee zaken verkleinen tot dezelfde reeks bewerkingen, Python leest not (val is None)en gebruikt de is notoperator . De eerste gebruikt de !=operator bij vergelijking met None.

Zoals aangegeven door andere antwoorden, is het een slecht idee om !=te gebruiken bij het vergelijken met None.


Antwoord 4, autoriteit 2%

Een van de laatste twee, aangezien valmogelijk van een type kan zijn dat __eq__()definieert om true te retourneren wanneer Nonewordt doorgegeven.

Other episodes