Проверка None, True и FalsePython

Программы на Python
Anonymous
Проверка None, True и False

Сообщение Anonymous »

У меня есть логический флаг, который может быть True или False, с None в качестве дополнительного допустимого значения. Каждое значение имеет разное значение.
Я понимаю, что Pythonic способ проверки True и None, а не None:

Код: Выделить всё

if bool_flag:
print("This will print if bool_flag is True")
# PEP8 approved method to check for True

if not bool_flag:
print("This will print if bool_flag is False or None")
# Also will print if bool_flag is an empty dict, sequence, or numeric 0

if bool_flag is None:
print("This will print if bool_flag  is None")

if bool_flag is not None:
print("This will print if bool_flag is True or False")
# Also will print if bool_flag is initialized as anything except None
И если вам нужно проверить все три в блоке операторов if, вы должны использовать многоуровневый подход, например:

Код: Выделить всё

if bool_flag:
print("This will print if bool_flag is True")
elif bool_flag is None:
print("This will print if bool_flag  is None")
else:
print("This will print if bool_flag is False")
# Note this will also print in any case where flag_bool is neither True nor None
Но что такое Pythonic способ просто проверки значения False (когда только проверка на False< /code>), когда флаг также может иметь значение None или True в качестве допустимого значения? Я видел несколько вопросов, но, похоже, консенсуса не было.
Написать «более питонично»:

Код: Выделить всё

# Option A:
if isinstance(bool_flag, bool) and not bool_flag:
print("This will print if bool_flag is False")

# Option B:
if bool_flag is not None and not bool_flag:
print("This will print if bool_flag is False")

## These two appear to be strictly prohibited by PEP8:
# Option C:
if bool_flag is False:
print("This will print if bool_flag is False")

# Option D:
if bool_flag == False:
print("This will print if bool_flag is False")

# Option E (per @CharlesDuffy):
match flag_bool:
case False:
print("This will print if bool_flag is False")

Эта тема обсуждалась ранее:
  • Как правильно проверить ложь?
  • Как в Python проверить, имеет ли переменная значение None, True или False
  • Есть ли разница между «== False» и «is not» при проверке для пустой строки?
  • Почему сравнение строк с использованием '==' или 'is' иногда дает другой результат?
  • Есть ли разница между "==" и "is"?
Похоже, это самый близкий ответ на мой вопрос из имеющихся (с учетом варианта A выше). ), но даже этот ответ неоднозначен (предполагается также вариант C): Однако этот ответ указывает на то, что if not flag_bool эквивалентен if bool(flag_value) == False, что означает, что проверка эквивалентности False с использованием оператора == является официальным методом Python проверки False (вариант D): Но это напрямую противоречит этому ответу, что '== False' (вариант D) никогда не следует использовать:

Подробнее здесь: https://stackoverflow.com/questions/784 ... e-vs-false

Вернуться в «Python»