Что должно заменить сравнения с 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"
Вы не хотите делать это, если вы действительно могли бы вернуть значение для случая "найден", которое имеет ложное значение. Например, если []
(пустой список) найден, это все равно будет сообщать "не найдено".
Если вы заботитесь, что это на самом деле False
использовать is
, True
, False
, а также None
являются синглетонами, поэтому используется оператор сравнения тождеств.
if myval is False:
"not found"
В этом случае вы используете False
в качестве часового значения, чтобы указать, что нет результата.
Обычно None
используется в качестве дозорного "без значения", поэтому я предлагаю вам изменить сигнатуру вашей функции для возврата None
если значение не найдено. Это лучше согласуется с идиомой Python и поведением таких методов, как {}.get('missing-key')
,
myval = findit('something')
if myval is None:
"not found"
В случаях, когда никакое значение дозорного невозможно, потому что любое значение может быть возвращено (даже None
или же False
), Python использует исключение, чтобы указать, что значение не найдено. Например {}['missing-key']
поднимет KeyError
,
В этом отношении Python более строго типизирован, чем C++. Только подлинные логические значения могут быть Истинными или Ложными.
Так my_var
должен быть логическим. Поэтому вы просто проверяете это как единое целое.
if not my_var:
continue