2014-12-28 1 views
12

В этом ответе https://stackoverflow.com/a/27680814/3456281, следующая конструкция представлена ​​Почему `если Exception` работа в Python

a=[1,2] 
while True: 
    if IndexError: 
     print ("Stopped.") 
     break 
    print(a[2]) 

, который фактически печатает«Остановлено». и перерывы (проверены с помощью Python 3.4.1).

Почему? Почему if IndexError даже законный? Почему a[2] не поднять IndexError без try ... except вокруг?

+1

Ну это был мой ответ, и я не понимал, что его всегда _True._ – GLHF

+0

Это действительно интересно, я не знал об этом – Crispy

+3

я удалил ответ, Im получение downvotes из-за этого :-) – GLHF

ответ

28

Все объекты имеют логическое значение. Если не определено иначе, это логическое значение имеет значение True.

Так что этот код является просто эквивалентом if True; поэтому выполнение немедленно достигает инструкции break, и print так и не дошел.

+0

источник для «если не определено иначе, все объекты True»? – Jasper

+15

@Jasper: https://docs.python.org/2/reference/datamodel.html#object.__nonzero__ говорит: «Если класс не определяет ни' __len __() ', ни' __nonzero __() ', все его экземпляры считаются истинными «. – BrenBarn

+2

@ Джаспер: и в [* Проверка достоверности истины *] (https://docs.python.org/2/library/stdtypes.html#truth-value-testing): * Любой объект может быть проверен на значение истины, для использовать в состоянии 'if' или' while' или в качестве операнда логических операций ниже. Следующие значения считаются ложными: [...] Все остальные значения считаются истинными, поэтому объекты многих типов всегда верны. * Исключения - это просто больше объектов. –

3

Просмотреть Python documentation, раздел Проверка значения истины в соответствии с встроенными типами стандартной библиотеки Python. Первое предложение, а первое предложение после последнего пункта указывает ответ на ваш вопрос.

Любой объект может быть проверен на значение истинности ...

и

Все остальные значения считаются истинно - так объекты многих типов всегда верно.

Вот полный текст документации, (содержание в скобках, [], добавляют в качестве увеличения):

5.1. Проверка значения истины

Любой объект может быть проверен на значение истины, для использования в условии if или while или в качестве операнда булевых операций ниже. Следующие значения считаются ложными:

  • None

  • False

  • ноль любого числового типа, например, 0, 0L, 0.0, 0j.

  • любая пустая последовательность, например, '', (), [].

  • любое пустое картографирование, например, {}.

  • экземпляры классов, определенных пользователем, если класс определяет __bool__() [__nonzero__() в Python 2] или __len__() метод, когда этот метод возвращает значение False целое число ноль или BOOL.[См модель данных, специальный метод имена, раздел Basic Customization, питон Language Reference]

Все остальные значения считаются истинно - так объекты многих типов всегда верно.

Операции и встроенные функции, имеющие логический результат всегда возвращения 0 или False за ложные и 1 или True для истинно, если иное не указано . (Важное исключение:. Булевы операции or и and всегда возвращение один из операндов)

Заключение

Так с Exception не имеет __bool__, __nonzero__ или __len__, (и не подпадают под другие условия, перечисленные выше) объект Exception всегда будет тестироваться как True в булевом контексте.