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

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.

Обычно вы просто используете not:

if not my_var: continue

В этом отношении Python на самом деле более сильно типизирован, чем C++. Только подлинные булевы могут быть истинными или ложными.

Поэтому my_var должно быть булевым. Поэтому вы просто проверяете его как один.

if not my_var:
     continue