None (null), или немного о типе NoneType

Ключевое слово null обычно используется во многих языках программирования, таких как Java, C++, C# и JavaScript. Это значение, которое присваивается переменной.

Концепция ключевого слова null в том, что она дает переменной нейтральное или "нулевое" поведение.

А что же в Python?

Эквивалент null в Python: None

Он был разработан таким образом, по двум причинам:

Многие утверждают, что слово null несколько эзотерично. Это не наиболее дружелюбное слово для новичков. Кроме того, None относится именно к требуемой функциональности - это ничего, и не имеет поведения.

Присвоить переменной значение None очень просто:

my_none_variable = None

Существует много случаев, когда следует использовать None.

Часто вы хотите выполнить действие, которое может работать либо завершиться неудачно. Используя None, вы можете проверить успех действия. Вот пример:

# Мы хотели бы подключиться к базе данных. Мы не знаем, верны ли логин и пароль
# Если соединение с базой будет неуспешно, то
# Он бросит исключение. Обратите внимание, что MyDatabase и DatabaseException
# НЕ являются реальными классами, мы просто используем их в качестве примеров.

try:
    database = MyDatabase(db_host, db_user, db_password, db_database)
    database_connection = database.connect()
except DatabaseException:
    pass

if database_connection is None:
    print('The database could not connect')
else:
    print('The database could connect')

Python является объектно-ориентированным, и поэтому None - тоже объект, и имеет свой тип.

>>> type(None)
<class 'NoneType'>

Проверка на None

Есть (формально) два способа проверить, на равенство None.

Один из способов - с помощью ключевого слова is.

Второй - с помощью == (но никогда не пользуйтесь вторым способом, и я попробую объяснить, почему).

Посмотрим на примеры:

null_variable = None
not_null_variable = 'Hello There!'

# The is keyword
if null_variable is None:
    print('null_variable is None')
else:
    print('null_variable is not None')

if not_null_variable is None:
    print('not_null_variable is None')
else:
    print('not_null_variable is not None')


# The == operator
if null_variable == None:
    print('null_variable is None')
else:
    print('null_variable is not None')

if not_null_variable == None:
    print('not_null_variable is None')
else:
    print('not_null_variable is not None')

Данный код выведет:

null_variable is None
not_null_variable is not None
null_variable is None
not_null_variable is not None

Отлично, так они делают одно и то же! Однако, не совсем. Для встроенных типов - да. Но с пользовательскими классами вы должны быть осторожны. Python предоставляет возможность переопределения операторов сравнения в пользовательских классах. Таким образом, вы можете сравнить классы, например, MyObject == MyOtherObject.

class MyClass:
    def __eq__(self, my_object):
        # Просто вернем True

        return True

my_class = MyClass()

if my_class is None:
    print('my_class is None, using the is keyword')
else:
    print('my_class is not None, using the is keyword')

if my_class == None:
    print('my_class is None, using the == syntax')
else:
    print('my_class is not None, using the == syntax')

И получаем немного неожиданный результат:

my_class is not None, using the is keyword
my_class is None, using the == syntax

Интересно, не правда ли? Вот поэтому нужно проверять на None с помощью ключевого слова is.

А ещё (для некоторых классов) вызов метода __eq__ может занимать много времени, и is будет просто-напросто быстрее.

Для вставки кода на Python в комментарий заключайте его в теги <pre><code class="python3">Ваш код</code></pre>
Опечатка в тексте:
Послать сообщение об ошибке автору?