MyTetra Share
Делитесь знаниями!
None (null), или немного о типе NoneType
Время создания: 29.07.2019 23:51
Раздел: !Закладки - Python - Типы данных в Python
Запись: xintrea/mytetra_db_adgaver_new/master/base/1533761874htpybhwp7d/text.html на raw.githubusercontent.com

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

 
MyTetra Share v.0.59
Яндекс индекс цитирования