Python: if not val, vs if val is None

Zawsze kodowałem w stylu if not value, jednak kilka poradników zwróciło moją uwagę, że chociaż ten styl działa, wydaje się, że ma 2 potencjalne problemy: {]}

  1. nie jest do końca czytelny; if value is None jest z pewnością bardziej zrozumiały.
  2. Może to mieć wpływ później (i powodować subtelne błędy), ponieważ rzeczy takie jak [] i 0 będą oceniać Do False, jak również.
[10]}zaczynam też stosować ten pomysł do innych porównań, takich as:
  • if not value vs if value is False
  • if not value vs if value is []

I tak idzie lista...

Pytanie brzmi, jak daleko posuniesz się z tą zasadą? Gdzie wytyczyć granicę, zachowując bezpieczeństwo kodu?

Czy powinienem zawsze używać stylu if value is None bez względu na wszystko?

Author: John Doe, 2011-08-22

5 answers

Użyj porównania do żadnego, jeśli tego chcesz. Użyj "if not value", jeśli chcesz tylko sprawdzić, czy wartość jest uważana za false(pusta lista, none, false).

Uważam ,że "jeśli nie wartość" jest czystsze patrząc i Pythonic.

Uważaj też na listy. Nie powinieneś używać is podczas porównywania pustej listy. Jeśli wiesz, że otrzymujesz listę, użyj if <list>, aby sprawdzić, czy zawiera ona jakąś zawartość (lub len ()). Spróbuj wpisać to do interpretera:
>>> a = []
>>> a is []
False

To dlatego, że tymczasowe lista, którą właśnie stworzyłeś, ma inny adres w pamięci niż adres przechowywany w 'a'. Nie widzisz tego z None, False lub True, ponieważ są to wszystkie wartości, które są singletonami (wszystkie odnoszą się do tej samej sekcji pamięci), więc użycie słowa kluczowego 'is' działa.

Znajdziesz również, że CPython intern ciągi, więc następujące działania.

>>> 'a' is 'a'
True

Powinieneś Nie polegać na tym. Jest to szczegół implementacji i nie jest to określone do pracy z każdą wersją Pythona.

 36
Author: Jonathan Sternberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-15 19:00:41

Nie. Jeśli chcesz uruchomić kod, gdy wartość jest false, ale nie jest None, to nie powiedzie się strasznie.

Użyj is None, jeśli sprawdzasz tożsamość za pomocą obiektu None. Użyj not value, Jeśli chcesz, aby wartość była False.

 32
Author: Wooble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 19:24:42

Używanie operatora is jest trochę problematyczne. if value is [] zawsze będzie false, na przykład, ponieważ żadne dwie aktywne listy nie mają tej samej tożsamości. Działa świetnie z None, ponieważ None jest singletonem (wszystkie odniesienia do None są tym samym obiektem), ale do innych porównań użyj ==.

Jednak if value i if not value są doskonale czytelne i użyteczne. IMHO nie ma potrzeby być bardziej szczegółowe, chyba że trzeba traktować różne rodzaje wartości prawdziwych lub fałszywych inaczej, jak np. rozróżnienie pomiędzy 0 i None.

 5
Author: kindall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 20:29:43

Moja odpowiedź jest prosta, ponieważ dotyczy większości problemów z kodowaniem: nie próbuj pisać czegoś, co po prostu działa. Staraj się wyrazić swoje zamiary tak wyraźnie, jak to możliwe. Jeśli chcesz sprawdzić, czy wartość jest false, użyj if not value. Jeśli chcesz sprawdzić None, zapisz to. To zawsze zależy od sytuacji i Twojego osądu.

Nie powinieneś szukać zasad, które można zastosować bez zastanowienia. Jeśli znajdziesz te zasady, to praca dla komputera, nie dla człowieka! ;-)

 4
Author: Achim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-17 12:06:07
if not value:
    pass

Jest dobra i "pythoniczna". Nie powoduje subtelnych błędów, zasady są jednoznaczne i (uważam) łatwe do zrozumienia .

Jeśli musisz odróżnić False od None, jak wspomniałeś, użyj:

if not value is None:  # or False, or == [], etc.
    pass

# more readable
if value is not None:  # or False, or != [], etc.
    pass
[[3]}uważam powyższe za rzadko konieczne. Ogólnie rzecz biorąc, preferuje się tworzenie pozytywnych warunków i stawianie ich na pierwszym miejscu. Są łatwiejsze do zrozumienia na pierwszy rzut oka i trzymają się dobrze wraz ze wzrostem złożoności (jak zawsze wydaje się).
if value:
    pass
else:
    pass
 1
Author: Gringo Suave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-02 17:27:22