В Python, как мне проверить, является ли переменная None, True или False - PullRequest
121 голосов
/ 07 января 2010

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

  • успех (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 выдавала исключение, поскольку все, что я хочу, чтобы внешняя программа сделала с ошибкой, - это записала ее и продолжила.

Ответы [ 5 ]

124 голосов
/ 07 января 2010
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 также может вызвать исключение из-за ошибки синтаксического анализа, и в этом случае вы либо перехватите его здесь, либо разрешите распространению уровня вверх, и бит печати будет уменьшен до одной строки, если-еще заявление.

108 голосов
/ 07 января 2010

Не бойся исключения! Запустить программу и продолжить ее так же просто, как:

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

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

18 голосов
/ 07 января 2010

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

if something == True:

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

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

if something == False:

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

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

3 голосов
/ 24 мая 2016

Я хотел бы подчеркнуть, что даже если бывают ситуации, когда if expr : недостаточно, потому что нужно убедиться, что expr равно True, а не просто отличается от 0 / None / что угодно , 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
2 голосов
/ 07 января 2010

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

result = simulate(open("myfile"))
if not result[0]:
  print "error parsing stream"
else:
  ret= result[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...