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: {]}
- nie jest do końca czytelny;
if value is None
jest z pewnością bardziej zrozumiały. - Może to mieć wpływ później (i powodować subtelne błędy), ponieważ rzeczy takie jak
[]
i0
będą oceniać DoFalse
, jak również.
-
if not value
vsif value is False
-
if not value
vsif 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?
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żyjif <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.
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.
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
.
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! ;-)
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
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