Что должно заменить сравнения с False в python?
У меня есть функция, которая возвращает False, если что-то не найдено, и возвращает структуру данных с тем, что я ищу в противном случае. Когда я присваиваю значение, возвращаемое этой функцией переменной my_var в цикле for, я делаю if my_var == False: continue, чтобы продолжить.
pychecker не любит этого и сообщает Comparisons with False are not necessary and may not work as expected.
Каков способ python для этого?
5 ответов:
Как возвращаемое значение, указывающее на отсутствие результата,
Noneпочти всегда лучше.
Если вы должны использовать
False, используйтеnot my_var. Это предполагает, что не -Falseвозвращаемые значения никогда не являются "ложными" (bool()преобразует их вFalse- это относится к пустым строкам, пустым коллекциям и некоторым другим вещам).Если объекты могут быть ложными, но их необходимо отличать от
False, то сравнение необходимо, и вам придется игнорировать ошибку (незначительное изменение,my_var is Falseбыло бы немного более идиоматично, но это практически то же самое). Но это не очень приятная ситуация, и вы должны избегать ее ради фальшивой ясности.Чтобы повторить: если это вообще возможно, используйте
Noneи проверьте дляmy_var is None.
Обычно вы возвращаете
NoneвместоFalse, т. е. если объект не совпадает. А потом проверитьif my_var == None:как всеnot 0,not Falseиnot NoneвозвращениеTrue.
Если вы просто хотите проверить ложное значение:
myval = findit('something') if not myval: "not found"Вы не хотите этого делать, если вы действительно можете вернуть значение для случая "is-found", которое имеет ложное значение. Например, если
[](пустой список) найден, он все равно сообщит "не найден"., Если вы заботитесь, что это на самом деле
False, Используйтеis.True,False, иNoneявляются синглетами, поэтому используется оператор сравнения идентичности.if myval is False: "not found"В этом случае вы используете
Falseв качестве значения sentinel, чтобы указать, что нет никакого результата.Обычно
Noneиспользуется как sentinel "no-value", однако, поэтому я предлагаю вам изменить сигнатуру вашей функции, чтобы вернутьNone, если значение не найдено. Это лучше согласуется с идиомой Python и поведением таких методов, как{}.get('missing-key').myval = findit('something') if myval is None: "not found"В случаях, когда значение sentinel невозможно, потому что любое значение может быть возвращено (даже
NoneилиFalse), Python использует исключение, чтобы сообщить, что значение не найдено. Например,{}['missing-key']подниметKeyError.