Что должно заменить сравнения с 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
.