MyTetra Share
Делитесь знаниями!
None (null), или немного о типе NoneType
Время создания: 16.07.2018 10:53
Текстовые метки: python check none
Раздел: Python

Ключевое слово 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 будет просто-напросто быстрее.

Так же в этом разделе:
 
MyTetra Share v.0.53
Яндекс индекс цитирования