В 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]