Программирование

Как правильно проверить переменную на None в Python

Узнайте, как корректно проверить переменную на None в Python с помощью оператора is, избегая ложных проверок и безопасно задавая значения по умолчанию.

Как проверить, что переменная равна None в Python? У меня есть функция, которая иногда возвращает None, и я хочу задать значение по умолчанию через if. Например:

python
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.

python
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 new is not suitable

if not new: evaluates to True for any falsy value: None, False, 0, '', [], {}, set(), etc.
Если ваша функция действительно может вернуть 0 или пустой список, вы, возможно, захотите, чтобы fallback не применялся, но он всё равно будет срабатывать, что обычно нежелательно.

Example

python
new = 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) поэтому является самым быстрым и самым явным способом:

python
if new is None:
    new = '#'

Согласно Stack Overflow, в действительности идиоматический способ проверки None — это is None.
Такой подход рекомендован руководствами стиля Python и избавляет от случайных проверок истинности.

Если вам нужна обратная проверка:

python
if new is not None:
    # do something with new

Assigning a default value in one line

Краткий шаблон, который сохраняет ясность намерения:

python
new = new if new is not None else '#'

или, более компактно:

python
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

Если вам нужен более явный типовой тест, можно использовать:

python
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 — это синглтон; сравнение по идентичности быстро и семантически точное.

Sources

  1. Stack Overflow – “Not None test in Python”
  2. byby.dev – “How to check if variable is None in Python”
  3. ParselTongue – “The proper way to check for None in Python”
  4. Bobby Hadz – “Check if a Variable is or is not None in Python”
  5. Python Documentation – None
Авторы
Проверено модерацией
Модерация