В Python, как я должен проверить, есть ли переменная None, True или False

У меня есть функция, которая может вернуть одну из трех вещей:

  • успех (True)
  • сбой (False)
  • поток чтения/разбора ошибок (None)

Мой вопрос: если я не должен тестировать True или False, как я должен видеть результат. Ниже показано, как я это делаю:

result = simulate(open("myfile"))
if result == None:
    print "error parsing stream"
elif result == True: # shouldn't do this
    print "result pass"
else:
    print "result fail"

это действительно так же просто, как удаление части == True или я должен добавить тип данных tri-bool. Я не хочу, чтобы функция simulate выдавала исключение, поскольку все, что я хочу, чтобы внешняя программа делала с ошибкой, регистрирует ее и продолжает.

Ответ 1

Не бойтесь Исключения! Наличие вашей программы только для входа и продолжения так же просто, как:

try:
    result = simulate(open("myfile"))
except SimulationException as sim_exc:
    print "error parsing stream", sim_exc
else:
    if result:
        print "result pass"
    else:
        print "result fail"

# execution continues from here, regardless of exception or not

И теперь у вас может быть гораздо более богатый тип уведомления от метода имитации относительно того, что точно пошло не так, если вы обнаружите ошибку/отсутствие ошибки, чтобы быть недостаточно информативным.

Ответ 2

if result is None:
    print "error parsing stream"
elif result:
    print "result pass"
else:
    print "result fail"

сохранить его простым и явным. Конечно, вы можете заранее определить словарь.

messages = {None: 'error', True: 'pass', False: 'fail'}
print messages[result]

Если вы планируете изменить свою функцию simulate, чтобы включить больше кодов возврата, сохранение этого кода может стать проблемой.

simulate может также вызвать исключение при ошибке разбора, и в этом случае вы либо поймаете его здесь, либо позвольте ему распространить уровень вверх, а бит печати будет уменьшен до однострочного if-else утверждение.

Ответ 3

Никогда, никогда, никогда не говори

if something == True:

Никогда. Это безумие, поскольку вы избыточно повторяете то, что избыточно указано как правило избыточного условия для оператора if.

Хуже, все еще, никогда, никогда, никогда не говори

if something == False:

У вас есть not. Не стесняйтесь использовать его.

Наконец, выполнение a == None неэффективно. Сделайте a is None. None - специальный одноэлементный объект, его может быть только один. Просто проверьте, есть ли у вас этот объект.

Ответ 4

Я хотел бы подчеркнуть, что даже если бы были ситуации, когда if expr : недостаточно, потому что нужно убедиться, что expr True и не просто отличается от 0/None/whatever, is следует выбирать из == по той же причине, о которой говорил С.Лотт, чтобы избежать == None.

Это действительно немного более эффективно, и вишня на пироге, более читаемая человеком.

Вход:

from time import time
t0 = time()
print ( ( 1 == 1 ) == True )
t1 = time()
print ( ( 1 == 1 ) is True )
t2 = time()
print '{:e}s\n{:e}s'.format( t1-t0, t2-t1)

Выход:

True
True
1.201630e-04s
8.797646e-05s

Ответ 5

Я считаю, что бросание исключения - лучшая идея для вашей ситуации. Альтернативой будет метод моделирования для возврата кортежа. Первым элементом будет статус, а второй - результат:

result = simulate(open("myfile"))
if not result[0]:
  print "error parsing stream"
else:
  ret= result[1]