Ошибка Try/Except при использовании «Нет»

У меня есть немного кода, который ведет себя не так, как ожидалось. Я сжал это до проблемы здесь:

item = None

try:
    if item != None:
        print('pass')
except TypeError, e:
    print('fail')

если элемент имеет тип, отличный от «Нет», он печатает проход. Я хотел создать исключение, если элемент равен None, но когда я устанавливаю для элемента значение None, ничего не распечатывается.

Я мог бы легко сделать это с помощью оператора if, но мне любопытно узнать, почему это не работает как попытка/за исключением.

есть идеи?

Спасибо!


person huitlacoche    schedule 08.07.2014    source источник
comment
вы хотите raise ошибку?   -  person yoopoo    schedule 08.07.2014
comment
item != None должно быть item is not None. Прочтите Pep8. Из Pep8: Сравнения с одиночками, такими как None, всегда должны выполняться с помощью is или is not, а не операторов равенства.   -  person Shadow9043    schedule 08.07.2014


Ответы (4)


В вашем блоке try нет ничего, что могло бы поднять TypeError, он просто проверяет, есть ли item !=None. item !=None будет True или False, но в любом случае не вызовет ошибки.

Вы можете сделать следующее:

item = None
try:
    if item != None: # better: if item is not None
        print('pass')
    else:        
        raise TypeError 
except TypeError:
    print('fail')

Или просто:

item = None
if item != None: # better: if item is not None
    print('pass')
else:
    print('fail')        
person timgeb    schedule 08.07.2014
comment
При тестировании на None всегда используйте is None или is not None. В конце концов, None — это синглтон. - person Martijn Pieters; 08.07.2014
comment
Спасибо, Мартджин, я старался максимально походить на код ОП, но оставлю комментарий, чтобы намекнуть на лучший способ его написания. - person timgeb; 08.07.2014
comment
Спасибо! Да, я не мог вспомнить, лучше ли использовать «есть/нет» с None. - person huitlacoche; 08.07.2014

Если вы действительно хотите вызвать исключение, когда item равно None, самый простой способ:

if item is None:
    raise TypeError("'None' value provided for item of farkling routine")

Как уже указывалось, в вашем примере вы не вызывали никаких исключений для срабатывания предложения except. Но, возможно, я неправильно понял ваш вопрос.

person holdenweb    schedule 08.07.2014

Более питонический способ:

item = None
result = 'pass' if item is not None else 'fail'
print result
person Angry Cat    schedule 08.07.2014

Ваш исходный код:

item = None

try:
    if item != None:
        print('pass')
except TypeError, e:
    print('fail')

Причина, по которой print('fail') в вашем except не работает, связана с тем, что на самом деле в блоке try exclude не возникало никаких ошибок. Подумайте об этом, переменная item была объявлена ​​выше, так что она существует. Затем вы проверяете, чтобы увидеть if item != None, в данном случае это None, однако это не вызовет исключения.

Давайте удалим item = None вот так.

try:
    if item != None:
        print('pass')
except TypeError, e:
    print('fail')

Вы обнаружите, что ваш блок try exclude теперь вызовет исключение, вызывающее ваш print('fail'). Это потому, что сейчас вы пытаетесь протестировать if item != None, но такой переменной item нет, отсюда и вызов исключения.

Простой способ проверить, является ли переменная None, состоит в том, чтобы сделать что-то вроде этого.

is_none = True if item is None else False
print(is_none)

что эквивалентно

if item is None:
    is_none = True
else:
    is_none = False

print(is_none)
person Erion S    schedule 03.06.2016
comment
Ваш пример is_none = True if item is None else False несколько отличается от Python, когда тот же результат достигается с помощью is_none = item is None. - person holdenweb; 14.09.2016
comment
@holdenweb Вы правы. Я не знаю, почему я сделал это именно так, потому что я не делаю этого в своем собственном коде, вероятно, чтобы быть немного более читабельным и показать использование встроенного оператора if для будущего использования. - person Erion S; 14.09.2016
comment
Мозги просто пукают иногда :) - person holdenweb; 14.09.2016