Python Portal
Фотография
Перестаньте использовать if obj == None, используйте if obj is None
В Python, когда вы пишете:
obj == None
вы не проверяете напрямую, является ли obj значением None. Вместо этого вы спрашиваете, равен ли объект None.
Да, во многих случаях результат будет таким же, как у кода:
obj is None
Но поведение у этих двух вариантов разное, и эта разница важна.
Когда вы используете:
obj == None
Python вызывает метод __eq__ у объекта. То есть сам объект решает, что значит "равен None". А этот метод можно переопределить.
Если obj это экземпляр класса, в котором __eq__ реализован так, что при сравнении с None возвращается True (даже если объект на самом деле не None), тогда obj == None может ошибочно дать True.
Пример:
class Weird:
def __eq__(self, other):
return True # Всегда утверждает, что равен
obj = Weird()
print(obj == None) # True
print(obj is None) # False
Здесь видно, что obj == None возвращает True из-за кастомного поведения оператора __eq__ в классе.
Из этого следует, что при использовании obj == None результат не всегда предсказуем.
С другой стороны, когда вы пишете:
obj is None
вы используете оператор is, который нельзя переопределить. Это значит, что результат всегда будет одинаковым и предсказуемым.
Оператор is проверяет идентичность объектов, то есть указывают ли две ссылки на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ такой проверки.
❤️ Поэтому всегда рекомендуется, и это best practice, использовать obj is None вместо obj == None ради предсказуемости и эффективности.
👉 @PythonPortal
46 · 6.8K ·