Python: исключения в назначениях - PullRequest
11 голосов
/ 13 декабря 2011

Если я попробую следующий код (в Python 3.2.2),

def f():
    raise Exception

x = f()

тогда кажется, что x не тронут - он либо остается неопределенным, либо сохраняет то значение, которое имел ранее. Гарантируется ли такое поведение всякий раз, когда правая часть назначения создает исключение? Я понимаю, что это очень простой вопрос, но я не могу найти много информации о том, как именно работает назначение. В более общем смысле, всегда ли оценивается вся правая часть до того, как произойдет что-либо, касающееся назначения? Верно ли это даже при использовании setattr, присвоении элементу списка или распаковке кортежей (т.е. что-то вроде x, y = y, f())?

Ответы [ 2 ]

13 голосов
/ 13 декабря 2011

Ссылка на язык Python указывает это:

http://docs.python.org/reference/expressions.html#evaluation-order

Python вычисляет выражения слева направо.Обратите внимание, что при оценке назначения правая сторона оценивается перед левой стороной.

Правая сторона оценивается, затем левая сторона, затем происходит само назначение.Таким образом,

def x():
    print "x"
    fail()

def y():
    print "y"
    fail()

x().a = y()

гарантированно напечатает «y» и завершится ошибкой с NameError;он никогда не поднимет «х» и не попытается выполнить какое-либо задание.

0 голосов
/ 13 декабря 2011

Документация Python относительно оператора присваивания прямо не говорит о том, что левая сторона присваивания никогда не затрагивается, когда правая часть вызывает исключение, но после прочтения этой статьи кажется, чтоиз этого следует, что единственный способ избежать назначения - вызвать исключение.

Заключение : левая сторона назначения никогда не затрагивается, если возбуждается исключение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...