Как правильно проверить переменную на None в Python
Узнайте, как корректно проверить переменную на None в Python с помощью оператора is, избегая ложных проверок и безопасно задавая значения по умолчанию.
Как проверить, что переменная равна None в Python? У меня есть функция, которая иногда возвращает None, и я хочу задать значение по умолчанию через if. Например:
if not new:
new = '#'
Мне кажется, этот способ неверный. Как правильно проверить переменную на None в Python?
The idiomatic way to test for None in Python is, in fact, to use identity comparison with the is operator.
if new is None: # true only when new is exactly None
new = '#'
This checks that new refers to the single None object, and ignores other “falsy” values such as 0, '', or [].
Contents
- Why
if not newis not suitable - The proper
is Nonetest - Assigning a default value in one line
- When to use
== Noneoris not None - Alternative checks
Why if not new is not suitable
if not new: evaluates to True for any falsy value: None, False, 0, '', [], {}, set(), etc.
Если ваша функция действительно может вернуть 0 или пустой список, вы, возможно, захотите, чтобы fallback не применялся, но он всё равно будет срабатывать, что обычно нежелательно.
Example
pythonnew = 0 if not new: # True, because 0 is falsy new = '#' # new becomes '#', losing the original 0
Для точной проверки None нужно тестировать идентичность, а не истинность.
The proper is None test
None — это синглтон в Python, т.е. существует ровно один объект этого типа.
Сравнение по идентичности (is) поэтому является самым быстрым и самым явным способом:
if new is None:
new = '#'
Согласно Stack Overflow, в действительности идиоматический способ проверки
None— этоis None.
Такой подход рекомендован руководствами стиля Python и избавляет от случайных проверок истинности.
Если вам нужна обратная проверка:
if new is not None:
# do something with new
Assigning a default value in one line
Краткий шаблон, который сохраняет ясность намерения:
new = new if new is not None else '#'
или, более компактно:
new = new or '#'
Идиома
orхорошо работает, когда вы хотите заменить любое «пустое» значение, но она также будет считать0,''или[]«отсутствующими».
Используйте её только тогда, когда эти значения действительно можно считать «пустыми» в вашем случае.
Для строгого fallback наNoneоставайтесь на проверкеis not None.
When to use == None or is not None
== None: Технически работает для большинства объектов, потому чтоNoneопределяет равенство, но может вызвать пользовательскую логику__eq__в подклассах, что иногда приводит к неожиданным результатам.
Избегайте в пользу идентичности.is not None: Предпочтительнее, когда нужно убедиться, что значение не является синглтономNone.
Это также гарантирует, что никакой подклассNoneType(который не может существовать) не будет ошибочно принят.
Документация Python по None рекомендует использовать
isиis notдля сравнений сNone.
Alternative checks
Если вам нужен более явный типовой тест, можно использовать:
if isinstance(new, type(None)):
new = '#'
Это эквивалентно new is None, но встречается реже.
Полезно, когда вы работаете с динамически типизированным кодом или хотите подчеркнуть проверку типа.
Conclusion
- Используйте
is Noneилиis not Noneдля надёжных и понятных проверок синглтонаNone. - Избегайте
if not new:, если только вы не хотите считать все «пустые» значения «отсутствующими». - Для однострочного присваивания по умолчанию предпочтительно
new = new if new is not None else default. - Помните, что
None— это синглтон; сравнение по идентичности быстро и семантически точное.