2016-01-22 3 views
4

PEP8 утверждает, что проверки для None должны выполняться с использованием is None. То же самое справедливо и для одиночных особей. Но PEP8 также говорится, что равенство истины и лжи не должно быть выполнена с использованием оператора, is будучи еще хуже, чем ==:Почему сравнение с True/False с использованием оператора is is bad?

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

Я понимаю, что первое из них является симпатичным и наиболее вещим способом, но иногда я найти себя в ситуации, когда я хочу явно показать, что сравниваюсь с True или False. Как is хуже, чем == в этой ситуации?

ответ

4

Равенство оператор == может быть реализован с помощью классов (а также всех других операторов сравнения), но is не может ,

Класс может быть определен таким образом, чтобы некоторые его экземпляры были равны True, но они все равно всегда будут ошибочно сравнивать is True. Рассмотрим булев подобный класс, например:

class MyBool: 
    def __init__(self, is_true): 
     self.is_true = bool(is_true) 

    def __eq__(self, other): 
     return self.is_true == bool(other) 

    def __bool__(self): 
     return self.is_true 

Этот класс может убедиться, что для экземпляра a = MyBool(True), все if a:, bool(a) и a == True будет вести себя должным образом. Однако a is True вернется False.

+1

Обратите внимание, что '__bool__' - это Python 3.X, а эквивалент Python 2.X -' __nonzero__'. Кроме того, если вы столкнулись с проблемой определения '__bool__', то' if MyBool() 'будет по-прежнему самым лучшим испытанием на истинность pythonic. –

3

is «хуже» в этом контексте, потому что требует точного объекта. Первое предложение допускает максимальную утиную печать, вторая позволяет получить некоторые типичные правдивые значения, последний из которых запрещает вам использовать любую утиную печать. Только True singleton проведет сравнение.

Это сравнение успешна:

1 == True 

Это сравнение безуспешное:

1 is True 
+0

Но люди будут серьезно сомневаться в ваших навыках, если вы написали 'if cond == True:' вместо if if if cond: 'или' if cond == False: 'вместо' if not cond: '. – kay

+0

Это была самая важная вещь, отмеченная в возможном дублирующем вопросе в комментарии выше. Похоже, что принцип максимальной утиной печати управляет спецификацией PEP8. –

+0

@ Kay Плохие привычки имеют глубокие корни. Я нахожу, что я делаю то же самое и на других языках. Я попытаюсь вспомнить об этом и, возможно, переосмыслить свои имена переменных/функций, если я почувствую необходимость явного сравнения с истинным/ложным в будущем. –

Смежные вопросы